pax_global_header00006660000000000000000000000064134360053430014513gustar00rootroot0000000000000052 comment=d2f0f90e08aa877252579c3b541dc30cff510823 golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/000077500000000000000000000000001343600534300216255ustar00rootroot00000000000000golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/.travis.yml000066400000000000000000000005441343600534300237410ustar00rootroot00000000000000sudo: required language: go go: - 1.10.x - 1.11.x - master matrix: fast_finish: true script: - make test - make bench - make cover - NOASM=1 make cover-sidh - GOARCH=arm64 OPTS=-c make test - GOARCH=arm64 NOASM=1 OPTS=-c make test after_script: - bash <(curl -s https://codecov.io/bash) -t 3cee0edf-64e9-4440-82f1-f1f41967f336 golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/LICENSE000066400000000000000000000055301343600534300226350ustar00rootroot00000000000000Copyright (c) 2017 Cloudflare. 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 Cloudflare 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. ======================================================================== The x64 field arithmetic implementation was derived from the Microsoft Research SIDH implementation, , available under the following license: ======================================================================== MIT License Copyright (c) Microsoft Corporation. All rights reserved. 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 golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/Makefile000066400000000000000000000045251343600534300232730ustar00rootroot00000000000000# Constants MK_FILE_PATH = $(lastword $(MAKEFILE_LIST)) PRJ_DIR = $(abspath $(dir $(MK_FILE_PATH))) GOPATH_LOCAL = $(PRJ_DIR)/build GOPATH_DIR = github.com/cloudflare/sidh VENDOR_DIR = build/vendor CSHAKE_PKG ?= github.com/henrydcase/nobs/hash/sha3 TARGETS = p503 p751 sidh sike GO ?= go GOARCH ?= OPTS_GCCGO ?= -compiler gccgo -O2 -g OPTS ?= OPTS_TAGS ?= -tags=noasm NOASM ?= # -run="NonExistent" is set to make sure tests are not run before benchmarking BENCH_OPTS ?= -bench=. -run="NonExistent" # whether to be verbose V ?= 1 ifeq ($(NOASM),1) OPTS+=$(OPTS_TAGS) endif ifeq ($(V),1) OPTS += -v # Be verbose BENCH_OPTS += -gcflags=-m # Show results from inlining endif all: test clean: rm -rf $(GOPATH_LOCAL) rm -rf coverage*.txt build_env: GOPATH=$(GOPATH_LOCAL) $(GO) get $(CSHAKE_PKG) mkdir -p $(GOPATH_LOCAL)/src/$(GOPATH_DIR) cp -rf internal $(GOPATH_LOCAL)/src/$(GOPATH_DIR) cp -rf etc $(GOPATH_LOCAL)/src/$(GOPATH_DIR) copy-target-%: cp -rf $* $(GOPATH_LOCAL)/src/$(GOPATH_DIR) prep_targets: build_env $(addprefix copy-target-, $(TARGETS)) install-%: prep_targets GOPATH=$(GOPATH_LOCAL) GOARCH=$(GOARCH) $(GO) install $(OPTS) $(GOPATH_DIR)/$* test-%: prep_targets GOPATH=$(GOPATH_LOCAL) $(GO) vet $(GOPATH_DIR)/$* GOPATH=$(GOPATH_LOCAL) GOARCH=$(GOARCH) $(GO) test $(OPTS) $(GOPATH_DIR)/$* bench-%: prep_targets GOMAXPROCS=1 GOPATH=$(GOPATH_LOCAL) $(GO) test $(OPTS) $(GOPATH_DIR)/$* $(BENCH_OPTS) cover-%: prep_targets GOPATH=$(GOPATH_LOCAL) $(GO) test \ -race -coverprofile=coverage_$*.txt -covermode=atomic $(OPTS) $(GOPATH_DIR)/$* cat coverage_$*.txt >> coverage.txt rm coverage_$*.txt vendor: clean mkdir -p $(VENDOR_DIR)/github_com/cloudflare/sidh/ rsync -a . $(VENDOR_DIR)/github_com/cloudflare/sidh/ \ --exclude=$(VENDOR_DIR) \ --exclude=.git \ --exclude=.travis.yml \ --exclude=README.md \ --exclude=Makefile \ --exclude=build # This swaps all imports with github.com to github_com, so that standard library doesn't # try to access external libraries. find $(VENDOR_DIR) -type f -iname "*.go" -print0 | xargs -0 sed -i 's/github\.com/github_com/g' bench: $(addprefix bench-, $(TARGETS)) cover: $(addprefix cover-, $(TARGETS)) install: $(addprefix install-, $(TARGETS)) test: $(addprefix test-, $(TARGETS)) golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/README.md000066400000000000000000000026121343600534300231050ustar00rootroot00000000000000# `sidh` Project provides a Go implementation of (ephemeral) supersingular isogeny Diffie-Hellman (SIDH) and supersingular isogeny key exchange (SIKE), as specified in [SIDH-spec, PQC NIST Submission](http://sike.org/files/SIDH-spec.pdf) (Nov 30, 2017). Portions of the field arithmetic were ported from the Microsoft Research implementation. The SIDH package does NOT implement key validation. It means that it should only be used for ephemeral DH. Each keypair should be used at most once. If you feel that SIDH may be appropriate for you, consult your cryptographer. ## Source code Project provides following packages: * ``p503``: P503 field arithmetic * ``p751``: P751 field arithmetic * ``sidh``: Implementation of SIDH key agreement * ``sike``: Implementation of SIKE PKE and KEM, based on ``sidh`` package ## Testing At development time following make targets may come handy: * ``make test`` : unit testing * ``make bench``: benchmarking * ``make cover``: produces code coverage as txt file (used by travis) It is possible to add one of following postfixes to each of the targets above, in order to run tests specific to ``-p503``, ``-p751``, ``-sidh`` or ``-sike``. ## Acknowledgements Special thanks to [Craig Costello](http://www.craigcostello.com.au/), [Diego Aranha](https://sites.google.com/site/dfaranha/), and [Deirdre Connolly](https://twitter.com/durumcrustulum) for advice and discussion. golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/etc/000077500000000000000000000000001343600534300224005ustar00rootroot00000000000000golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/etc/PQCkemKAT_434.rsp000066400000000000000000007736421343600534300252230ustar00rootroot00000000000000# SIKEp503 count = 0 seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 pk = 0999A0BB085F85FDA70D04B8FCAE5A30989947F1E32E4BC4675C834CA22CBA08AE692935EC1C8AF2B5BF377EC17E79D09D57DB5828C6F6E1C1A64D0F30AF3D2F76D9D329108E01D027D856EC44B23A437872D538F2C26E48723E2F8E46A2E7A364C92D997C7B801ADA199EEFFBAB1161B29EC7CB4440DA0E75407F4CE02E37BDFB23154C513BD30CFA5F04D2E253357CBDEBCF6F539965C8B8B5F350A50526AD1B350A0220394AA33B18EB3E765F059FA7CB5585A9D18C8B198A07DA0E9CCEC61D6F43A4661CA6D8175C23A8C86DD30409607D6EBFA3639CDFD12599F9BB073AAEA9A1CC95FF0D50839049EDFAE95FD10DD4F27EC3C6921FA96DCB0366D9C086A8E8ED15390C4827E5672D167EE238229B188C0590E1FA38E8A74D34B6D17ECA1A64EA76AD65413F147DC43A762D69D072DADF573C13A7C983F9362D59DC6E37704BA0F15637CF6BEDBBD8C1051366FE4C21E03CC55964C0E24F6F8D738DC763B7E443122C63751F6D8130EADA4203A9671865F8D459035EAC2E sk = 7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB148038626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB0F0999A0BB085F85FDA70D04B8FCAE5A30989947F1E32E4BC4675C834CA22CBA08AE692935EC1C8AF2B5BF377EC17E79D09D57DB5828C6F6E1C1A64D0F30AF3D2F76D9D329108E01D027D856EC44B23A437872D538F2C26E48723E2F8E46A2E7A364C92D997C7B801ADA199EEFFBAB1161B29EC7CB4440DA0E75407F4CE02E37BDFB23154C513BD30CFA5F04D2E253357CBDEBCF6F539965C8B8B5F350A50526AD1B350A0220394AA33B18EB3E765F059FA7CB5585A9D18C8B198A07DA0E9CCEC61D6F43A4661CA6D8175C23A8C86DD30409607D6EBFA3639CDFD12599F9BB073AAEA9A1CC95FF0D50839049EDFAE95FD10DD4F27EC3C6921FA96DCB0366D9C086A8E8ED15390C4827E5672D167EE238229B188C0590E1FA38E8A74D34B6D17ECA1A64EA76AD65413F147DC43A762D69D072DADF573C13A7C983F9362D59DC6E37704BA0F15637CF6BEDBBD8C1051366FE4C21E03CC55964C0E24F6F8D738DC763B7E443122C63751F6D8130EADA4203A9671865F8D459035EAC2E ct = 89611D5DB90BAA5BCC1F076B0B1FA275D8EAB09FD4EBD8B5D05D0864F95815CEF9F7952612968A459FA5C5F3791534916EC4F77C44CC59ED0EF96E44D45020B381FFD4F974AF89D41017C95B04E852174307B629D8479737BF3B5A597FD7689B00D2078D0D4D45166C49ECE65FB84D00EFF1E0A70D5727306865EBC8FF25C6F718BD4EFCE230A9317A01ABB35DBD00004146B9C9EA33FF4C43F541E0AFC23A7409F769AA8B25FF0AA6A3E41A7C7ADBD02043DAE72B794F1EBF123DAE1E06782D9F1287EE5D88813BE64BFD0B67D751AA6AAA6FC3B27D3F7FD9766D9B9AA5EF3CD4061898F37D916CD9378931EBF0234F00932200F2489ABD35944328D09178104970E9BBE25FA81ACA265DACF045A81897246A347B6CCCF70CB65E375A6F629D847A48AF98DE8165C3AFA882B5143CF2F453B5A39A5329E091542EE40B5D16367808F536EC39761B37D635943D312FF1DCDAF2254FA45D549DADBF5A999CBF1D9985908AA3D740DC59138EE19ABA882B3D4758B72C0DB81D681AAE44096514DBFF5E9512687025808CA10F45D395DF515FB0 ss = 4346C330BBB2526CECFCC8238FA86913 count = 1 seed = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC81ADDE6AEEB4A5A875C3BFCADFA958F pk = AD4291FE871F32E213A04D25DB79BE6B3BCEF20277FB47F397549250571F95B7773E3F84823D84C8E7699666D8B8D6C962E0A4B0E501DCBB4F57DEE9AECA016A701E0361EA273464DE6FA0880F61C0D12014D27A0C175FF5ABF7E68FA8BBAFF46D2B3EF3674CA1BDA4973EC7F3627471A021EF4A5BB642FCC19D583C133BE1C66B36F46C61DCB53A0914A9AABABAECFCC5886AC2DBC44C7F15A3C6F584C8CB017D692854EA4006F8ADEA0DDD48EB69CD3F3373AE9F30155F2D852250210F7A53F4C010056EDB905BB82C39E4C9E56B2FE1187F89774F284D0696914B0341EABF43010AAF508D216064F965C7E2ACA80B82762D8F95F3672227CED31692FCB67952B85B3587F73DA0FE1D1C8D22A2446ED63711FB0C0ABFBBBF0253ECE1A6757AA10183479448E0A27892A1C5AEFE3EAE5DC55E79A514D73BAB8B19F74E607F30303A14C838BFE8D1CEAC1F48F76AF8DA5E9C3FFE67A4EA33FECF61FE8B26C7642AD02CB522BB5EA9E9F1935E7EA590D52220EDA948AE7EE03604 sk = D60B93492A1D8C1C7BA6FC0B733137F3406CEE8110A93F17003271531CF27285B8721ED5CB46853043B346A66CBA6CF765F1B0EAA40BF602AD4291FE871F32E213A04D25DB79BE6B3BCEF20277FB47F397549250571F95B7773E3F84823D84C8E7699666D8B8D6C962E0A4B0E501DCBB4F57DEE9AECA016A701E0361EA273464DE6FA0880F61C0D12014D27A0C175FF5ABF7E68FA8BBAFF46D2B3EF3674CA1BDA4973EC7F3627471A021EF4A5BB642FCC19D583C133BE1C66B36F46C61DCB53A0914A9AABABAECFCC5886AC2DBC44C7F15A3C6F584C8CB017D692854EA4006F8ADEA0DDD48EB69CD3F3373AE9F30155F2D852250210F7A53F4C010056EDB905BB82C39E4C9E56B2FE1187F89774F284D0696914B0341EABF43010AAF508D216064F965C7E2ACA80B82762D8F95F3672227CED31692FCB67952B85B3587F73DA0FE1D1C8D22A2446ED63711FB0C0ABFBBBF0253ECE1A6757AA10183479448E0A27892A1C5AEFE3EAE5DC55E79A514D73BAB8B19F74E607F30303A14C838BFE8D1CEAC1F48F76AF8DA5E9C3FFE67A4EA33FECF61FE8B26C7642AD02CB522BB5EA9E9F1935E7EA590D52220EDA948AE7EE03604 ct = 0BA524F9F01CAA22CBFBFE744AEA8D2C0CD534291424B613077422D25435024577ACDF49356B43BA0475428354E3E294070D57AEE29DE81380600456B39F0E0DC959372C94B883A5D20C5EB879B54D825CEA693AFCADB8DEEED43A51B5FFF177D81D50B13F5357837FA8B349177E0B14FEC790989E2F6820C9054914F51C9B4BC773A527246FA13778E28A41A9FABDA71C3C2A9C0BFCA7393A4F271F531CCFD3A40F86273094D1EACA7541C037D6EE62D7D370D4670731F845EDA1E920263EA9E0F574566048270DCB9AB07D7B3E565619AC2BEA499CDF52771C09AF3B61B02781D13A28966DCB117733C31A4CA361A9AD5526F892C47F03BDEE462103DD14B8CB18232F174C028AED04306650299F66A929ADBB1EE7FC22D03FD2BAF88911EFF4B74C3762724E9E5A33DBE27EAEA743540EB75E9C7625FA519C12B67C1E88254E4796801104ADF702B4D2BB9D2BE7D268759630CEE00FD50A1A0B43696B1F96708028C06AFC2C3B4FBEBA40B4E9496B4A9D333A6A100362CE0EDB5C07F12FE29A22D1A86012DE9DE39F394C5ABE32444E7B ss = B5DB5992AD277FE747BEFB677040FFC0 count = 2 seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 pk = 8E1924039A1BD47E21BC95C9246B5C8F3356DBD251DEC594A4BEBA5F7B1A2AD95A9FC3217E70759B65CC8F4A643A0ADC36E1C0A29FBFD7A9D7496DDA697435BC5EA3B6E72500B54D7571253F57EFA19BA3EBF5D6C0F6B042CE15B8539F7CFAE79404AFE5DB9674DC7428928DA8855E4CDB348E847FDBD1907D3626FD7F30AE8F6C24A58E8B50CB6B6A25E558A9F78CEEE69430FB0FFFA805FCC80B1B011AED52F99E63FAC6C56792BF6C19433250BA25B6C15D5E9B2DAEAE9DF9473117FA8EBB626BF75DDFEE7DB8ADE1FDF18076E4C17FA1261452608C288379F728F3299B29CAE383B7418501E77F6CB73D0B96E70E44006B143B1687D1109CB023BD66ECF6EE8DC9A8BADF8F181475BBC2B4F4B4E4C965CBB8590EEE3AF26A6A0F10070D983BB5E3CB59C0C13917DBFE58269030116A1A321EF2C1894D17822D2E91814D4E5A6A3B90FA015014A6F59EB95962E40FFDB26A4B3C5B70897D803DB398319AE7F956231C5890D7434C1CD06A95A6E13BC4DAF6AA1E4F69ABC317 sk = 4B622DE1350119C45A9F2E2EF3DC5DF50A759D138CDFBD64E82FCC97CA60CCB27BF6938C975658AEB8B4D37CFFBDE25D97E561F36C219A0E8E1924039A1BD47E21BC95C9246B5C8F3356DBD251DEC594A4BEBA5F7B1A2AD95A9FC3217E70759B65CC8F4A643A0ADC36E1C0A29FBFD7A9D7496DDA697435BC5EA3B6E72500B54D7571253F57EFA19BA3EBF5D6C0F6B042CE15B8539F7CFAE79404AFE5DB9674DC7428928DA8855E4CDB348E847FDBD1907D3626FD7F30AE8F6C24A58E8B50CB6B6A25E558A9F78CEEE69430FB0FFFA805FCC80B1B011AED52F99E63FAC6C56792BF6C19433250BA25B6C15D5E9B2DAEAE9DF9473117FA8EBB626BF75DDFEE7DB8ADE1FDF18076E4C17FA1261452608C288379F728F3299B29CAE383B7418501E77F6CB73D0B96E70E44006B143B1687D1109CB023BD66ECF6EE8DC9A8BADF8F181475BBC2B4F4B4E4C965CBB8590EEE3AF26A6A0F10070D983BB5E3CB59C0C13917DBFE58269030116A1A321EF2C1894D17822D2E91814D4E5A6A3B90FA015014A6F59EB95962E40FFDB26A4B3C5B70897D803DB398319AE7F956231C5890D7434C1CD06A95A6E13BC4DAF6AA1E4F69ABC317 ct = BBC0929CAFF99A0403167129E6735AE969CB2CA5AA30A992776FF0770BDFAB12A55983787B52D11FDDD53DFA607CF9B9C98AD0736E287967F8AF4099E06E2B4AE32885CF5A40C1DE310073F35C2FDE947484DB9F68A58E6100DB0F5E3CAEFADA961474061E1DF707464E1F746CE440C9F4E6FBEDD68A0E8111EFB3B1C83A9809136BE9AD5C743BC2141BD6F5CE434F0A88D30F3F5EF7BC599CE5E26DBF0992B57125BF4C9D76ECEA3F85A11B1E4E2234B69F64DEF6D3F243CAFE95B9061D6A9F45FBBD7603D028E49662F2DD201A37772ABB83AD12C9A724AB9C27B18017639CF8D3617B190073D10E5C0382611956422680EAD702A57B5A97A8E209F14973B98A5052381D78D33B1DA16A298F1E29EE07DD94484A54BB5DC685F7FA6B34892D065C88275DAB9FF377B9FE4CE8EE2A0700501E5CFB58887662A72651952D1A99379BCF8A94A2EDC96B78A8DD33CBBD056AD2A945002E3AC10576614D9035D1782DBDE8176FA274CFDB1A39CA4C44500602F9F1D725B13C366B1AB92EF7B33DBDF38552E70803C8C206E2DDD425BB555028B4 ss = 117914C6EE09FAC850DB582DEABA6546 count = 3 seed = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1A pk = 0D775DDDAEEB4CBB584FC98FB49F2FF025F6F5E1BACC1D796F39826A61E0B298AE063409423A05755A03094FD1A82657DBC66B2CFB4FBE6ACB2F82AEBC353AC62322B564FD51822D15457F5BBA29942E1D531F5FBD3076AD30A77EBAF3DDCC6146808DB3A441D19DBC09B6C9DF345B8651B9803166F62643574B34D3E437B2E6C905DE1DA557C29F1EDFD843A2F0792D82CAFA07AC6192246847432D6E1DAA196B7AD23369EE60912908D76CFA685B803FD5FE239BC8BD611F76D7AB31F592A1B7DD6C8B10239A6339240CD1A262C92FF15DEDA3C57CBF2FCDE978E0A566A4A7E356ADC1EFC8036076665BDD8F9759B8E773AACA945C63598321C530525D91AC77AE287444FD95D72899326F74EF843372C1116226A4E06D345C41C4070C3EEA2ABDB96858076C761DAF8302FEA069761CF6954D380EDEE5AFEF17F019353085A32873FAE1C1098872E83ECF47AE6AFD1613E506BD80C2E9133619A0B9C78825CB2349C6002E4260008CF917A8D8265A44ECBA57443708ECD937 sk = 050D58F9F757EDC1E8180E3808B806F5BBB3586DB3470B06DE950541FD53A8A47AAA8CDFE80D928262A5EF7F8129EC3EF92F78D7CC32EF000D775DDDAEEB4CBB584FC98FB49F2FF025F6F5E1BACC1D796F39826A61E0B298AE063409423A05755A03094FD1A82657DBC66B2CFB4FBE6ACB2F82AEBC353AC62322B564FD51822D15457F5BBA29942E1D531F5FBD3076AD30A77EBAF3DDCC6146808DB3A441D19DBC09B6C9DF345B8651B9803166F62643574B34D3E437B2E6C905DE1DA557C29F1EDFD843A2F0792D82CAFA07AC6192246847432D6E1DAA196B7AD23369EE60912908D76CFA685B803FD5FE239BC8BD611F76D7AB31F592A1B7DD6C8B10239A6339240CD1A262C92FF15DEDA3C57CBF2FCDE978E0A566A4A7E356ADC1EFC8036076665BDD8F9759B8E773AACA945C63598321C530525D91AC77AE287444FD95D72899326F74EF843372C1116226A4E06D345C41C4070C3EEA2ABDB96858076C761DAF8302FEA069761CF6954D380EDEE5AFEF17F019353085A32873FAE1C1098872E83ECF47AE6AFD1613E506BD80C2E9133619A0B9C78825CB2349C6002E4260008CF917A8D8265A44ECBA57443708ECD937 ct = 1823E1425DC55E1B55078BE45A2E37E3AE4656889A0BCD74F5B8596117B705AFD7F4FA945DE51E68B2C07431C6C669CABB7712D65116F7F2A4435FBFC78525EBD02CE72F590B9347DF08BFE7F59B741FB352124C7A058786D38767237E0EF23F7E60FCC05846AC8CDC692BBA5899441095DB899621806DD035870F09B60815AD492BF0A9E13E0D65066285E298F567A19D54734C95F325591C321B508ACCC4370BEAE4ACC6571EAA63600170B39C71DF297AF880F508F7849FA2B60B3F23A667D707F5C22886D0159575EC15A187D1298F3A9ADC10F20978E76135D4385AB8876B7E4CE54D15D20245B62940175629C88AC888F87143FB8B01916B2DADC26D341D1FFB37EF9B6D2DD203CC8B84629512E270189C9788A900D2821538A38C9860746FCF2506BA4D9EFDCEF2ACA52814811D24D93E390CBDDFF32F01B171EDFE33FE1AE17627EBE3F8EFFE9E47598A261474E66BF1F117BD545DF8B8D5FF2CF121E866109AA8A46306FAAAFFD9EC7C280AA99B05366BD36F22CA340E267CDEF68066DDCC8EA9D1F75C528D6F40F08030D9C8A6 ss = 05285E8F9F81C749D7EB42CE41507CC6 count = 4 seed = EDC76E7C1523E3862552133FEA4D2AB05C69FB54A9354F0846456A2A407E071DF4650EC0E0A5666A52CD09462DBC51F9 pk = 474E2B7B828B4169F32429274C864FBA82675AD37A5502D3A5D7009EF2D98EFD6193A5F0A3CE9F244061776E92A258ACD80E0606A6568E7F1435CBF70E4015B0AE3322705122E0D6F889F408A26C97B400E3135803DC00A0ADAEA36B751A2DB7043409DD1CA49568C9D324D1FB02280D179149F77A21C057933C6C44C733834619DA448A1ADA5D5DACE97FA5DE742B1600EA04360224BDED07E02E084DC1AE9FE1574F46604DEBD9773D5FE85EC25A72E700932FDBA0C41EB3CACECB07AA221D497894F93570B65EAA58CFE62586F1155D189A354FFC9D191F64E0054365B1FAAD6B4F8024E3C7CCD3A673D4FAF69D062FA184C4D1F315CE9FE4E22D7F393C6E36C4A4C9829ABA6BEF38BE6142E1D705A37372526E1EFC5979E25CBA54CC36687D51431391003E784856819748D176AD0EBDA5AFA3B6BCD7881E374BC822D59AA603F77563DA71F77BDC648F5BEBC0B708863D293A9A1DD03541E84F863C86497CFE57C19FF05758C14DD1514C4DCD96718CEC60AA4E0CC6941D sk = 66B79B844E0C2ADAD694E0478661AC46FE6B6001F6A71FF8BE2D3C64D38269A1EE8660B9A2BEAEB9F5AC022E8F0A357FEEBFD13B06813804474E2B7B828B4169F32429274C864FBA82675AD37A5502D3A5D7009EF2D98EFD6193A5F0A3CE9F244061776E92A258ACD80E0606A6568E7F1435CBF70E4015B0AE3322705122E0D6F889F408A26C97B400E3135803DC00A0ADAEA36B751A2DB7043409DD1CA49568C9D324D1FB02280D179149F77A21C057933C6C44C733834619DA448A1ADA5D5DACE97FA5DE742B1600EA04360224BDED07E02E084DC1AE9FE1574F46604DEBD9773D5FE85EC25A72E700932FDBA0C41EB3CACECB07AA221D497894F93570B65EAA58CFE62586F1155D189A354FFC9D191F64E0054365B1FAAD6B4F8024E3C7CCD3A673D4FAF69D062FA184C4D1F315CE9FE4E22D7F393C6E36C4A4C9829ABA6BEF38BE6142E1D705A37372526E1EFC5979E25CBA54CC36687D51431391003E784856819748D176AD0EBDA5AFA3B6BCD7881E374BC822D59AA603F77563DA71F77BDC648F5BEBC0B708863D293A9A1DD03541E84F863C86497CFE57C19FF05758C14DD1514C4DCD96718CEC60AA4E0CC6941D ct = 4013B299AEA7681CEE91D42743D3DF7AB243DBC85EBF412BD0E89030BA5F5A8EEFA497D34725B8CDFB7DB19ADEF33DE1C20A75EAD433A325E250512E8D281EBD14C46FA4C1A9388C1CAB40FAF99022B9CAB070979DDCD55D70E0BC6672ECD76FE1DBAD198632C5187561A4E21A9AC58CE53145C062926BBDB2FA73F80B22175F2C2C18FD905FAB414EB5D3801C202CFCF17E61486E6FE23F2587576E9395EF2EF02B6F495A845A8941D16D5E9D5F76D06D5CE13D3D9A953040EDFE200B309B9B7C4DE0171A1C02D7FCD68C5B350A592C8A781866F47B17B584C07030A5CF7B6F0EAEE34C0EBD962154CD625E1E2832CD4479619E6FD338A44B73D90DDF1C468255404EB2DA87E8B55868E1296E1077AE8F894A18A105393B1D38803F697E78870173C9B38BFEDC7A9A2E6E231C066E11200BA558BD8FA1A4A2CA0FFA5FBB8C709F6CE6354570BE9E819E75857CD10ECCB3D7390F504212320B1F0ED2DEBC11CBAE1878273927E51D2B22B8C9D39E4C8714DD6EFC02CB42D2F3330B76D8EE6471524A7C89A436D5200430F89C4CD552CABDAA ss = 869B23C6147548D2B34B169E3C94A460 count = 5 seed = AA93649193C2C5985ACF8F9E6AC50C36AE16A2526D7C684F7A3BB4ABCD7B6FF790E82BADCE89BC7380D66251F97AAAAA pk = B2D12F4C65DA60F9F0ED6436A28DF7A635894D7E8B2A523C95A04953AD860D6B5E046F8FA0A77357D05F16F4289BF2F27B23D6E66DC1E8B3BBCEA68AD11E362D4FD6A6861B3F94560EF7B7FE6764689746976D206B52ADD67C1813807699606A442FE4F5B62761DD9B2228DBA10E4FD2B80902FC29720DEE79B192CCD93BCCCFCCF7ED2F4DCF5AF81150CC12C67AC2FF6AE02BC3F5C2E581617EBCD9765C158431B33EF7A563898645CFB0B772577EF8EC6830B37E1F660BE894F9522DE19721B6407BA0551CD6339E9B0390883156C187DA72185C91048F93262D6AFC32798C5F2A671BFB1A16822BF2071E721291C0AD3B2C544C12C93A9547EF22E2213A870325F060F6FFDB8445710AD57786D9CC983154640632A70435A7156847B71D85AB49AEAB9EED5E4B6450D0BF660B3691DA8673CC6AC4B17A7A78150859D083F8569A117615C8EE892701E9412938CE1BF6CFC2532B85A1AA293F9FFD30D43EADB5898E8848C3EBD8CE854EB0401F47FE4369E3AA795C180F0A15 sk = 7EC408F52C9AA723D0C41D9987682A5F4CE6C9DA7CD0215AA08CCF451B049FD51D7A9AD77AE14A81569DF8C9BD3A8F1EBEA86FDCFB823002B2D12F4C65DA60F9F0ED6436A28DF7A635894D7E8B2A523C95A04953AD860D6B5E046F8FA0A77357D05F16F4289BF2F27B23D6E66DC1E8B3BBCEA68AD11E362D4FD6A6861B3F94560EF7B7FE6764689746976D206B52ADD67C1813807699606A442FE4F5B62761DD9B2228DBA10E4FD2B80902FC29720DEE79B192CCD93BCCCFCCF7ED2F4DCF5AF81150CC12C67AC2FF6AE02BC3F5C2E581617EBCD9765C158431B33EF7A563898645CFB0B772577EF8EC6830B37E1F660BE894F9522DE19721B6407BA0551CD6339E9B0390883156C187DA72185C91048F93262D6AFC32798C5F2A671BFB1A16822BF2071E721291C0AD3B2C544C12C93A9547EF22E2213A870325F060F6FFDB8445710AD57786D9CC983154640632A70435A7156847B71D85AB49AEAB9EED5E4B6450D0BF660B3691DA8673CC6AC4B17A7A78150859D083F8569A117615C8EE892701E9412938CE1BF6CFC2532B85A1AA293F9FFD30D43EADB5898E8848C3EBD8CE854EB0401F47FE4369E3AA795C180F0A15 ct = C3DEBEC051D27460D02C88A69AC8C12EB72C9ED9A68CBF4141550B6FD0DA2E6F21A876E1D6E959758BC520C1FA5A680231838D0B73260911836DC3783FC71338FEEEC913EECE44BBFF2B615008DAAEFFDA6A8F5EF9719B1B8F42628D844FE1E2171D43515381B5DC08F185455A2FC2481D3F2E7DD06FF9B69F02146A0E0BCDA44F75CEB91D981BEE8D059DC7EB6A178756BFEA33A2E09AE09F7DAF043932971A7EBBD476FB8D319875E2093C29B28FE838DFE4097444A819279E4355187BBAF998D9941A045BAB9A01804DCBDBE0301DC25DCADCFEED4C63991F21593DA24261997E377508700D71ED03381FE7D448B1CF5DB07C444B9E4B82FDFC3B5931C4FD3879BBC211EFC9F27767AB93DB6B3658314D26E8827B78A795DB07F5BC16135F0F9215A3AF612698A086773228285D9A66335FE208E235902840207EEC880A23F769A7FDEDB51B78FCF6D2D540E08C4533CEB814137B2B0D32E7224B6F25A28E49E7816D0EADBB00AEED66FB387EB312D0F3DE4D2BF64A440D39BF9BC69444058BDF5FB72D6715B7456C232D8520A1CA3D53 ss = 407BF6423B119BEA303F7DA6FDCB1CCA count = 6 seed = 2E014DC7C2696B9F6D4AF555CBA4B931B34863FF60E2341D4FDFE472FEF2FE2C33E0813FC5CAFDE4E30277FE522A9049 pk = AF2E1D9620704112613F3F0AC4798CCAA27BD6117E5F4FF6CD924EB10DAA8EE9C86C897003F3024BE2968984DBB3BAD1EC7DC0F0E121F6885A6CC494ED9A28D6DEBB39C7CA2FB7A249A11CE998478FA344BAF1B283AFA756E912E07742C26A6BFE2A338E5678FBE4917C0F33B31121E73EECD48A961EA493297FB6B3831086EB27EB56D7C3346676AE1B4CE48883E85656EAB24F8DF3CAAD84AAAAE535B76CB775E1CB3BA30C5CD695160E0CFEDDE3D3EB7AD7A428F26DA03D0D6E7A28A6BB576A98EA8099559118AEEDD6FAB5837C87D16ABCC6DF75F7C5D6C3788A50FB04F08210E1D9263C6676EC6A2B4CB1ECEF254AE406F0E01686978D1C891CBAE5D9925BEBB8DD4658FC1D847727E70D4CA6F9DF0AD6AF18F315FDBF0E8B8CB80FD1DD8B069D285D13B021C3E1E5D7AA26C778138A667572F61B264BDD0826FC6A9725FD95874C3989F7FA08F6C35A5ACCC0E85E684DCA24E04E8062353991316231C7BA52144D5373A5B9FD3DA8A90DC135FE8F6923492CA8B14C5111 sk = C121915BFEF6ABDFC177DAE2F5A24218F9ABDA2559AFC67484EF52DB5EAA6DF8EC3A0BC5FFA730DB0DDE8C5F38F266D5C680A78D264A7B06AF2E1D9620704112613F3F0AC4798CCAA27BD6117E5F4FF6CD924EB10DAA8EE9C86C897003F3024BE2968984DBB3BAD1EC7DC0F0E121F6885A6CC494ED9A28D6DEBB39C7CA2FB7A249A11CE998478FA344BAF1B283AFA756E912E07742C26A6BFE2A338E5678FBE4917C0F33B31121E73EECD48A961EA493297FB6B3831086EB27EB56D7C3346676AE1B4CE48883E85656EAB24F8DF3CAAD84AAAAE535B76CB775E1CB3BA30C5CD695160E0CFEDDE3D3EB7AD7A428F26DA03D0D6E7A28A6BB576A98EA8099559118AEEDD6FAB5837C87D16ABCC6DF75F7C5D6C3788A50FB04F08210E1D9263C6676EC6A2B4CB1ECEF254AE406F0E01686978D1C891CBAE5D9925BEBB8DD4658FC1D847727E70D4CA6F9DF0AD6AF18F315FDBF0E8B8CB80FD1DD8B069D285D13B021C3E1E5D7AA26C778138A667572F61B264BDD0826FC6A9725FD95874C3989F7FA08F6C35A5ACCC0E85E684DCA24E04E8062353991316231C7BA52144D5373A5B9FD3DA8A90DC135FE8F6923492CA8B14C5111 ct = 34362B4166EE921E04474293CD7A38938D291603708D9702F1F385D2873A4116D304724A74C681E6050E663CEDF864FB30DA124DC40F86AD7BF5ABF17A55246D704A742253061F382ED3D86B6A779C8A6E65DCF1B9CB36B373E22ABF60B36F91126DC3AF3529DFF5E838C944649C9E70456BB8B2E3D6A1A229954375251A01D009C7072A330E528EC0ADD3A4DC1E3F310C58F8F8538E4B0B9F2CF694BAADD13B6E9B14BED2C1EC19B6EAA0B0E74DAEF62E46DF488FDE2C29D4B39D1940D48E4207A908A48BBCA50741920E5839F14C77F30ABD36C6FCBDDDD7ABDE4FD125652E41428F8EF7FB186F1D1EF69ABF93C43FA28CE181D3C878E09AD9E0312D2914A5E4929730CDF41525AFE2232DAB9BF7C39AB3FD0C60CD3E0BFE97539D474239A61636611FD084DDB74DB809800D7BA122B88817901283C7C6B2BA36D1AD812CA2D9AD5B32E514048AFB975E62F67A29DEEA43E2DBFEB943C5B694ABDE3351EC880581BEA351E22A5BF39615DEE710645FDC178FE70223A2D9C51F216AC6374239C174F35906A5CD5E5A6E38B6D6E63ACBA747 ss = 257AC29EEAC6B952F887E5A2DCAB8F2C count = 7 seed = AEFB28FDD34E0AB403A703B535296E3A545CA479C1D8148E2D501B3C8DD8B1034BD986F13F1A7B4671BE769359FD2AAB pk = 9D8799BCD44AC862C94312BB42037FA60B7DFF7284346055D056A685B00DB94014AFE58A48045E39C556648B75A9045D9D91C1CF91CA59FB7D60150174471295C96B426E086FC2DBCE4726F247AA0165B8E69E7A7D2A9BB32EBC311C2D560E79C771CF9494F55DF2A9C3C64464F119F8668E759F8127DF303D37A8F724347E6117F244AC23DFA7EAB9E5E52BAA1EAB369A1A618EDE8E8D9DF983E8CE30460D7FC60A6DF484FC99D994A01605BF8B0D7044C91C842CD8E111E3A1FB162BA570DB528EE85D9831DC1A5711038343F2267C26C90829C6D82C4CD93A665689921DED487F8E9748D62F6ED4BE0B130B8D783029993493D042FB88FADF0401CFCEC03A9A8B303D5ADCC06A3A111705193216B6304671D2D71088CBD0BE774219DCF839F2577904294F49146E18415BAEFA4F25B59384A21904952E14101B4E5775A92F880325045CA30D17C711A758A03A7424F1846CAA5DCC065953E76DF1541342E3BB536628AD3B98AF30AB4031D7FEC19F31AD3F4710C80AD10D32 sk = D86634ECF96CC2603761E284C0E36734CEDEC64E7FF4864699DAF37400CFE59841AFC412EC97F2929DC84A6F3C36F378EE84CE3E46CD12099D8799BCD44AC862C94312BB42037FA60B7DFF7284346055D056A685B00DB94014AFE58A48045E39C556648B75A9045D9D91C1CF91CA59FB7D60150174471295C96B426E086FC2DBCE4726F247AA0165B8E69E7A7D2A9BB32EBC311C2D560E79C771CF9494F55DF2A9C3C64464F119F8668E759F8127DF303D37A8F724347E6117F244AC23DFA7EAB9E5E52BAA1EAB369A1A618EDE8E8D9DF983E8CE30460D7FC60A6DF484FC99D994A01605BF8B0D7044C91C842CD8E111E3A1FB162BA570DB528EE85D9831DC1A5711038343F2267C26C90829C6D82C4CD93A665689921DED487F8E9748D62F6ED4BE0B130B8D783029993493D042FB88FADF0401CFCEC03A9A8B303D5ADCC06A3A111705193216B6304671D2D71088CBD0BE774219DCF839F2577904294F49146E18415BAEFA4F25B59384A21904952E14101B4E5775A92F880325045CA30D17C711A758A03A7424F1846CAA5DCC065953E76DF1541342E3BB536628AD3B98AF30AB4031D7FEC19F31AD3F4710C80AD10D32 ct = 1A64D14D16BE965F9FA2C9F5B7CA68EFF6742FFA2E2E4956A56B1E7D6387A7AD683733005EEB25ACBC494F49170619922F9AFCB1657506F12E6C8C98B1A737D5616749DF1696D3EE2EA5AF09BF248D856C30B080E97582162901B77CCEF5F4018A2B4E1FB2C1F386E1520561FBAC27437B114DD8C418D6FA7F6294C3E738A16FABD12BFBEE09BF4A7E5CD3DB125AC6EC77EF3EDCCD145A35B220DE487A9268DCC116942F9A91676B3C1EEE79642B4FE51162403B75CB11C3F0F0A22D1066B9AABD5BAA4E43A182156F61FF016E5E6787707822A4A70E488ECC7DAAB7378E7F21EF496272AD3F8DA95A749084B4368A14FA34D56F59F3D18305E3B50062E7EB430B235FEE4C45A0F119348096317E943E312237F6E780AE6EF738E0634581FCD80190ADC28539BECA88E6F233145B37B67F749E8267178011E5AB1F6132CE86FE84ECCD6A6BE281CF080EC8AFA6EB9F81BC47113FFDDEF48CE5B0B55337CBB482D49E1D22D44BF1D9CA88D784B3C7B0EC010C7647304735A37809C253AD5D0399C47C09DA91D043AF50A6D43C7A61DC51017B ss = FF33202E25308946B34171420C1FFB67 count = 8 seed = CBE5161E8DE02DDA7DE204AEB0FBB4CA81344BA8C30FE357A4664E5D2988A03B64184D7DC69F8D367550E5FEA0876D41 pk = 973156DBFA8D13A58D7300D6665CBEF008ABC0595D56A0FF8DDF0214CEBC3667F5CBFAE3F479F9799BE047BFF15D92AE767939248BE053AE987BC2806E741B3DD8B5C8400EBC7AFF3B71D8767FEA8BF85CE2729873428F5E3933ECEAFB8D85559FA5287C484E838FF722ACC95412CA40957E9DD5FD916973FE885F8D78084393BE80103C32690E14CA286E6A0A5DE869DD5933656581B52E40463D44218AAEBAB275CFA00B1F89D53F3AC014B65F320E2161AA4E275FB4A6F145F2B03FFC91F7499E3269B2DA8E1E1BDE9A5020A2213386B7B262F5DA5C03C0468D025519814920F0AAC14AF2568C37869724CBE489B19B09E45BEDD14DA2B8B9702A806E128299EF1EBE6465AC3F519908D0A7A9126C57FCFC78FF1B99523F62BABF7EFDAE47DC45CD11F8AC6AA36E69C047F5D0262E30BCBA4CC9539E7ED17824807F85A581F3A01D37A05C3F9A2C1BD6B8C3CF8540D0264FFB4566788BEA085350416894E32E84CE90AE96F5E26657FC0A1700E8E4B0E5123CBA47EE3C9319 sk = 0610678FF4DC3128E1619F915DC192C220F8FAD94DA1943BDA1804DDB5AA9B1C6A47A98F8505A49BAE2AFFDE5FE75E69E828E546A6771004973156DBFA8D13A58D7300D6665CBEF008ABC0595D56A0FF8DDF0214CEBC3667F5CBFAE3F479F9799BE047BFF15D92AE767939248BE053AE987BC2806E741B3DD8B5C8400EBC7AFF3B71D8767FEA8BF85CE2729873428F5E3933ECEAFB8D85559FA5287C484E838FF722ACC95412CA40957E9DD5FD916973FE885F8D78084393BE80103C32690E14CA286E6A0A5DE869DD5933656581B52E40463D44218AAEBAB275CFA00B1F89D53F3AC014B65F320E2161AA4E275FB4A6F145F2B03FFC91F7499E3269B2DA8E1E1BDE9A5020A2213386B7B262F5DA5C03C0468D025519814920F0AAC14AF2568C37869724CBE489B19B09E45BEDD14DA2B8B9702A806E128299EF1EBE6465AC3F519908D0A7A9126C57FCFC78FF1B99523F62BABF7EFDAE47DC45CD11F8AC6AA36E69C047F5D0262E30BCBA4CC9539E7ED17824807F85A581F3A01D37A05C3F9A2C1BD6B8C3CF8540D0264FFB4566788BEA085350416894E32E84CE90AE96F5E26657FC0A1700E8E4B0E5123CBA47EE3C9319 ct = 60A6D5643CA8FD71F02B492C27CC99B732DAD4DC9329F14A8343C417B2FD7BE5C40D55FF3250BD4CB8E15ACA6EE041DFBD51B53EB9F20C36E262DC4CC156316F7F68E4F9B38A200175CD82D109CD5E5AAEFEE46E6FD185FA233C38710EAA691A4673EC1BAB92F7DFE6CCDE50F3BE4CE042B6870D12B0E50D8D0D73B70F37347375D43188D28927BA4E3233C1C6602A7A7028CC2738EE74D17CF6435824C5D28BBFF3E16D1535B20D6758A979BD0BC4FEA390A0E7F6B94CEA31A204C012DD8E603438FA9640831EB796FA954F402A1D07116F583EC564C473C4046C4D361D369943CF4C0FF3E3D6E5C71C546EE807E88BC6EBC5278931C81BC9F27E0C71ABE82A6E601C3816341B99D9A1F03C5916AE62D8DCB335F99BE6A74533FF43E04AFA00F0EB93C0E4B49C48F69D111E070B35E7BCE9943402EFF246AC0433B78686FD43C780F26E106129DD4BCB6918C3B4C5E5259354FFF3D9DBD2A151E9091FCC67071C9D62DC0D2A8C2C2254D2C13DC3DE5EC125382F56FF5328AC084CB88551CAFDA4D058D6A744E99EFEF9D3C0EBA23CDBB755 ss = 15D5FB32C1E43645FC856D5F89A8AAB9 count = 9 seed = B4663A7A9883386A2AE4CBD93787E247BF26087E3826D1B8DBEB679E49C0BB286E114F0E9F42F61F63DEC42B4F974846 pk = EB11AD975B8DC144A5608E62657E5A611764AA4ECB405C7372A0FB99843D4CE7B65806C0BAD6D086F3623D5821F731C91EAD79A417FBC0652505441605DF39C191B4CE2B5CF4206DC51056CBC437F5E0EBDE9D0475302936CB8610EC6E8EC925F9B15DE6F5B312BD831A4F1B7BF4C2DED3BCB40E48065335ADEDF4AB603579E648C3BF6ACD6B0C66B3D38CA8186D25228CA97BE045801E2CB18C2F3BA8E29ABFEABB0DD8A1FD11D73F2AD2BB13803E76139638A953374218AAD71B0932AC645A803ADA021C26926FCC16C19FC471AACDE8FB1B3BDE4AA91C33DA796B2672A34D0D492DD48D9952EEDC10EBC090F33E78740B3A50817281E691795A40599B967D53A730D7E5D3ADE4D6D7D669F24F9327B8ED2E7312CA6ED2E021864202B00BC20BAAD40A5743A02E7CF82A041B99F0CBBABEE479CCB01F6F2340305441CACB161A4A6F9BFC5C574312A89AC18C4F6881C7C9210A984E246EFB62F324304009B56CA07FAFC8713577AF56CCE9D92146D73585969225F45B0CAD08 sk = D322D56D8EF067BA1F24C92492B9C56DF3A6EF54A304ADC156047447B810CC094D400AB204CF9AE71E3AFA68B88586ECB6498C68AC0E5109EB11AD975B8DC144A5608E62657E5A611764AA4ECB405C7372A0FB99843D4CE7B65806C0BAD6D086F3623D5821F731C91EAD79A417FBC0652505441605DF39C191B4CE2B5CF4206DC51056CBC437F5E0EBDE9D0475302936CB8610EC6E8EC925F9B15DE6F5B312BD831A4F1B7BF4C2DED3BCB40E48065335ADEDF4AB603579E648C3BF6ACD6B0C66B3D38CA8186D25228CA97BE045801E2CB18C2F3BA8E29ABFEABB0DD8A1FD11D73F2AD2BB13803E76139638A953374218AAD71B0932AC645A803ADA021C26926FCC16C19FC471AACDE8FB1B3BDE4AA91C33DA796B2672A34D0D492DD48D9952EEDC10EBC090F33E78740B3A50817281E691795A40599B967D53A730D7E5D3ADE4D6D7D669F24F9327B8ED2E7312CA6ED2E021864202B00BC20BAAD40A5743A02E7CF82A041B99F0CBBABEE479CCB01F6F2340305441CACB161A4A6F9BFC5C574312A89AC18C4F6881C7C9210A984E246EFB62F324304009B56CA07FAFC8713577AF56CCE9D92146D73585969225F45B0CAD08 ct = BCCC1E6ACAF320BF985A83B4B1031F41167DF07E507EF13424FCF815838A6BBAA027C02ACC4500EF41B76DA466037BA177B20CE10B82E143A603B28CFF41280D481DA8DF798B7BB32F424D2D272BA653ECB17F3DE313EAF7FF40F78DD75718C1D39C779E0876DBC9F0DF1BABD5345FBC86B6537A771729995B14A947E424EA6663AE7C5542A1D2574392743421AC08E18CFC4453D732F843F40144F492A05484F40ACD3F08925627561A3FF838E3050F3496E30DEBAB9EC41BB92641036366A5FDBD0071B71B97E51AB661C9CEF8EC8F7FB3A6DDCCD1290144E7E7A325FD568D584362FE9ABEDE6FAF66CDE455FF110F3FEE5977523FAB726F0D3B02921FE1BE799672C142B6F69BCC7C9E79F86BA6584081F793FAC491A282C96435B872132B8DFB54CAE599E2756583F4662929006FA0150283F5830E2AF13B3031E64D746A2A2CD92E67E0F8D4D1585867F66490168527ECF712C29CE659FE0638DF580421B2359315DDF576237537FBEC623DA28B9EC800E4EEE51A01BF1747E7805BCAF53408F6A0DAEB0A116780280137AF84FCA0A6 ss = 2717DAFB00EB0A39977833FED3245270 count = 10 seed = 980D0BA7C8F8B23D0E948A6029FF2659810EA1360064663A8994D0333C8543EE5FF5D6D5C9ACF446E61DC464F792B9D3 pk = 1729D61BE220F49CBA0E8A78F1ADCF5DF2658E23874BA69765EAF2167639F2AFD5DEF78FA8DAD1745D997950779752C98B2D7CA2E726CA7A8F208960EB0633572010FE829D070AA62AC0E103DDAE6C71CF494BFF1FF53A389DFB8794AB2BD1365BA094ED6F3D285F187E295660E1B275F6E875A6E33B9298A44B8F39D032BFFAC4922CB14A95B0F0CFE55D45367E605EBD3F7BAD3C8BDF3797A70038FA6CC3665C1A160E8E2F1BC13992655D4898C0AB5CAE75EDFE03D600C46FC9EA0E53710FD88E26F5F44A54857DB99273EBABE7A8CA202CEE0DA1E4FA3FD11F5CE7FA77DE3C9D4075CAA787AF371908D602DDB4A80233F6D5A410EA675FE35C2E0E48DF36342DA186A948BF5D3028944A98058F65DBF4A71D4FD71B4BB4B69D8D8436284D347CA40367F50F23B8F2FF89DD3A8E119CD7520CE522EBB80B4D3F9750421DB28BC1163B7FF3CFD8250129549053BCBF4E15BD09C3A1FB5F7888463F6C5FFBEEC9D4D59B0AC9A4216D60020572D2D6F41514D6D09660C59F4420 sk = 2F1D8A3BEBB34540324B9485FDF3D5BE3B858F544ABC3FC68D6C42E7270EE2B77B6045385F3D175984A0E260363166C73B0C70C9716443031729D61BE220F49CBA0E8A78F1ADCF5DF2658E23874BA69765EAF2167639F2AFD5DEF78FA8DAD1745D997950779752C98B2D7CA2E726CA7A8F208960EB0633572010FE829D070AA62AC0E103DDAE6C71CF494BFF1FF53A389DFB8794AB2BD1365BA094ED6F3D285F187E295660E1B275F6E875A6E33B9298A44B8F39D032BFFAC4922CB14A95B0F0CFE55D45367E605EBD3F7BAD3C8BDF3797A70038FA6CC3665C1A160E8E2F1BC13992655D4898C0AB5CAE75EDFE03D600C46FC9EA0E53710FD88E26F5F44A54857DB99273EBABE7A8CA202CEE0DA1E4FA3FD11F5CE7FA77DE3C9D4075CAA787AF371908D602DDB4A80233F6D5A410EA675FE35C2E0E48DF36342DA186A948BF5D3028944A98058F65DBF4A71D4FD71B4BB4B69D8D8436284D347CA40367F50F23B8F2FF89DD3A8E119CD7520CE522EBB80B4D3F9750421DB28BC1163B7FF3CFD8250129549053BCBF4E15BD09C3A1FB5F7888463F6C5FFBEEC9D4D59B0AC9A4216D60020572D2D6F41514D6D09660C59F4420 ct = B982F5360AE0D6683B3104EEDDFB5D5130CC9B9D590B51807A55D725CC54F6984A09D679C8B669E4C9F8F0E146EA256DCC0655DEC651409D2664E26FB2331E8CBA8D7C1F9AA6F386DBE75A1D66B8858741E89371FF8D88E9A8F7BBF7CE0BFBF1CF388EAAA283B4B20024B2679D0D50C824FD8334D7A206767772A1B612264718C8B4C31FCF46CC883144C43E0ACF8A8314FF1D5A65E33981EBAF26A55D5DC39C6ABD412365E6D21A5AF0B307F9E04ED495B6096355793F482E3A32361D532FE714BA95815254238F4A20FE0247BADB9003F50D5BA1DC090B3CC5FC354EAC61475870B8F958725870BD3D591713665CB84C205B43A3F81425A22F763C5C4CCE6BFB896E17EF2F0FF9D1F632E5D8FD5CBEE8B695C1E0EF6B3F85BECBCE78BFF31C89BE521D3658E669D3D2182AE80389F790803716850A7E0E8C392D91D884991BF3A559FC5A3A29DC2387747B4CA68D8E658055CF196D1441DAE59A541E3353C18D2188F271175B9572997864456E1007DFFBF2898C5CECA2233DA3B464BB0338951F0BFE3CE7DF02BBF6CA2B383F4FCF02D8 ss = 30840E1414DF2542136A0DC0EF14C9C8 count = 11 seed = 6C029462CA42ED520F10A579F52687101105E0B90C6E7BFA582A4C112B579D5AD0A0ABD38F72ABCFDCAAF5893A112BDC pk = 01DBA9AF4C32E82D29C244B0683AF597508BF60A2D1B6A2AF2A97DDAE092402F7CB143970A8665E44E1AF0191F832056F7F61A1A52571F7C82AAA362F0B8344C4BCD988A6DA40905D528C1FF49B3A824E5EE6D4AED23FDC7D0875188B728F714BE9112217455D207AF934F99C2EED6CDAD092F35B318CCFE68351FB1C31A5631E7D0FAFE529662B9CE3B5B51F9F229243AF099E1BD52EC73711CF458C3945F21E9DD64227175C65F03CA6A51E1A09D76A672E782538082A17D344D50282BEAF7179B91D5F1F17BCDD7675C932E3ADC3E3CDDB0A95813DF8D440B34297E94F316FD225F08E54C79047E8E475270D51B0819C7324FCE74F9E6F5B66D026B3980185207E36E264D16D0881AD6353A4C5C9659F0394F0528B16500DC482938EC10BFBCF79367AA1A288DC297BE868B19515F5CA5DCA3B781D0DAE43B230AF637BA1A9C75CA1F08CABA2B3F93FAAC07101D2BB3BFB7DC69B46EB69D45A322808CDF330096F0BBEBDC785178D237325E213B7EA1A3E3B70C5DFF7D4232 sk = 31BEDA3462627F601CBC56F3DDF4424E1529C04737EF0EF2812083BFA3B670E3EAF9B443702FB6DB16AC1197656BBD61A8E25ED523B8D10501DBA9AF4C32E82D29C244B0683AF597508BF60A2D1B6A2AF2A97DDAE092402F7CB143970A8665E44E1AF0191F832056F7F61A1A52571F7C82AAA362F0B8344C4BCD988A6DA40905D528C1FF49B3A824E5EE6D4AED23FDC7D0875188B728F714BE9112217455D207AF934F99C2EED6CDAD092F35B318CCFE68351FB1C31A5631E7D0FAFE529662B9CE3B5B51F9F229243AF099E1BD52EC73711CF458C3945F21E9DD64227175C65F03CA6A51E1A09D76A672E782538082A17D344D50282BEAF7179B91D5F1F17BCDD7675C932E3ADC3E3CDDB0A95813DF8D440B34297E94F316FD225F08E54C79047E8E475270D51B0819C7324FCE74F9E6F5B66D026B3980185207E36E264D16D0881AD6353A4C5C9659F0394F0528B16500DC482938EC10BFBCF79367AA1A288DC297BE868B19515F5CA5DCA3B781D0DAE43B230AF637BA1A9C75CA1F08CABA2B3F93FAAC07101D2BB3BFB7DC69B46EB69D45A322808CDF330096F0BBEBDC785178D237325E213B7EA1A3E3B70C5DFF7D4232 ct = CBB3918EC9AA60E7BAF511DE2413DBB64BF37DDBAF0C81B44E272778A05DC0EF9194BC204BE0A20CCD76674044BF6E9E2C794143B9CEACD0C256EB2871F80FA2B3AFA6FD8B270AD21CEC7908006B97E70670ABB41D7B2ED112A5A6189A81C4D614EEB65A6B3DA57637AEF6FE23DF80265945B89F634DD3469072437F150F76E1AA957DBBE8B8DC61F0C5EB28EB25B861ADA8F686B3C626917EF412CF49FA280BF0DA3F9E2486CA25F3D94599CA3A70C317C44795C98AD25E3877873A14BFE7BCAD04362B7B9F5A03C36075740B235BD804CB03478FA42072F81803CFB3D42608B184D24B83295EFC1417D69FA177A748F51FA3BCC67BA021D7E72A1D0BE7BEAB1F12764A1646A1EF36781509A82449D8D8991156DAD64487C95B296A6F85A0EE7BAD069FB9066D1FA37B1EF448AAE83DCD3C54BA886A74F273A5084B8F0F6E37A49B5F1CF29161E4F7316824DEBE708114FE11D5035DE26ED53300AC0303DBCE27CC68CEF0D6C6DE2A6B36D5FEA5EC403B3C9CCE746667C0713DDA3C9F8A889F37D1029208CBAC5B9F586FE9CDB6252A5F35 ss = 100D6491573BD34330D0367019F4C4BD count = 12 seed = DB00120937570D62331F4C3F19A10465231EFF46465CDEE336A0D46AA1E7493DF80F18617F9FFD0476CF7784A403EF4F pk = 482E4A589E6B9235C7EBCE7A77B48F31B7EF5F139F50056B024AF43184D3C8977740B74424220541C4DEC067746DDE32FA34500B72C6F5140CEC2FB0E1B0381040F79DA43E0A7DDE667E6B143DA4983D0A136E2691FA8A94C7E41B121D1C2856005C0BA8792FCB1F643E109D687816002657DE76D909D76DE3758293D901E7F04B0E0EB16EC99187A099D3D45A54CE18916B0B8B8F18E2166166E0D63E4753A39221F3E0123B93748595B2B1D242313D2D6EF5E353AD10327D0A194B11F772BF56B8176939A81948155FB58DF9BE49666B4DD7D77725A91C48B56A58B98EC75E82CCD6856FEBF180B756FAD81D52FC3B6DF11D4DC7DDF2A341BD28340A4D9725FF9EBA608B4A5EEFE10700F170F9498B8BC4B12E25DED0FBBE0D2D2FE14099D27A69D639D96525FECB68AD8046980928C78A894233BBF036A01A20C0C89FDD99496E0D6A6FD9C4AEE3394F8D4D3E4DAA39875680A631E660D496E124568D45DEB06733795279BE2A6CBC45101BD49CE56C14DCF970822367C93A sk = CBDFF028766D558AF4466EF14043A1A9CF765F7748C63CC08E9A30597E4B52FFA87A54B83C91D12A5E9C2CD90FCAC2C11B3A348240411A0C482E4A589E6B9235C7EBCE7A77B48F31B7EF5F139F50056B024AF43184D3C8977740B74424220541C4DEC067746DDE32FA34500B72C6F5140CEC2FB0E1B0381040F79DA43E0A7DDE667E6B143DA4983D0A136E2691FA8A94C7E41B121D1C2856005C0BA8792FCB1F643E109D687816002657DE76D909D76DE3758293D901E7F04B0E0EB16EC99187A099D3D45A54CE18916B0B8B8F18E2166166E0D63E4753A39221F3E0123B93748595B2B1D242313D2D6EF5E353AD10327D0A194B11F772BF56B8176939A81948155FB58DF9BE49666B4DD7D77725A91C48B56A58B98EC75E82CCD6856FEBF180B756FAD81D52FC3B6DF11D4DC7DDF2A341BD28340A4D9725FF9EBA608B4A5EEFE10700F170F9498B8BC4B12E25DED0FBBE0D2D2FE14099D27A69D639D96525FECB68AD8046980928C78A894233BBF036A01A20C0C89FDD99496E0D6A6FD9C4AEE3394F8D4D3E4DAA39875680A631E660D496E124568D45DEB06733795279BE2A6CBC45101BD49CE56C14DCF970822367C93A ct = EE1DF3CB9293446482991F20D6D593EABDF396ECCFE4DFF05049AC944EBCE9907D2A205A6A7E76B2D1DE0B9872619266B9155939600EDDB031AB58A02E860961CCAED38C0A8BBBA3BCFB07F95E70983DBD2EB988B8FAFD4260227203C07E48240FC753CB2AE0DB8BC9EECAAED4005925C330553A29094E10B9BE268BA925C3918C65818C6B784CD0251D5888AAEF191C7FF43F4B88EFECCDFD297A865F7D5DAED533E92D8B87CF8B47A1235625B60710FEE1C3BD3B553698346EE8CA0E0CAEBB82FB0FE1B69F28AFFD8EC7C52DBCED469156DF286E59BA004D94AE29BD8F3A7530D582F42EE38D12C70D6AB9EAA6B2040E245B4CDCD1D3CA5BA1D93B01FED40EF464E39AED94840FF687B37F935B5DE0AA480A1A7A7DE5C8DEB3664D111DE06F756105A965B3DA8EB46C5FF9D189D94F12A63B65C8DE3CE679CF0FA89553A03FCF17121B4A5948F8FCDA2838F12EABAE5A4BBFEC6F6F9288BE4C124BCC416069A42E6DF12559854250A5D54ECC6613A84A479EB200352DED4038BCD4AAA81605C18B368135C20F2F728789B558A8A8C76B63 ss = 4E8896CB8F77DCFB629C2B7985B5412E count = 13 seed = BD26C0B9A33E3B9B4C5D7EA32D5BD1FC371015BE163C86F584E49BFD5362C8D8341161CD1308115B2A03B7E5EADDD418 pk = DFD9A1E84BCE8FB3889D8AE2C5FB74E7C5BB14ED970E8C5865B40E34E1B7CD044C255363B2F34DE9934DA626651FE9FAD9A3BE0371336E39848C80662A642C9D4E35B143CE37E32BF7F51BBE3FB0385E559C218F3003032A2103EDD39FC6004B64038BEA9CE9E84FDFB4195DA74C84B812F33C2E41D7F16CE8F13C11012D5AED3E3B858A63026CFC0E839507F58AB688A8958F614AC82164F4D2750A9226E90804C14E091904D1F9B5312EE2CC78E7D180D105EC35A61B3B8C50C825308ECE01081E1735AB3DC873E265811EF38421D3B72D9ABA4F150F45615BE5DC9573F3150D91B46552E32C6103DC72FAE7431348A2B6D9F413B4C0F805B2232B7DF54CA1333A8B57BD1BE78206AC56D4FA2FBEF96F7B59C053101287541DA7D9A8BCB6C2B23C9023A466147815FF1ABA6FC8C74CB7966DA0E4767363EAA523A59A7AF54D24B67BCA70144FD232480981C251820AA3007C92FFBC9F209B2AFB2F98EB3167AF2A15572DD774315B320EB931D35C31A802B0A3DA4A12E2E51F sk = 4C04310BEA66305C6CA8BA6B8F61CA96257A67663AFC11768AEC87A9A79204CEE2986867A2906EB851B734B8B22B91D6749B1A5F07C44E0BDFD9A1E84BCE8FB3889D8AE2C5FB74E7C5BB14ED970E8C5865B40E34E1B7CD044C255363B2F34DE9934DA626651FE9FAD9A3BE0371336E39848C80662A642C9D4E35B143CE37E32BF7F51BBE3FB0385E559C218F3003032A2103EDD39FC6004B64038BEA9CE9E84FDFB4195DA74C84B812F33C2E41D7F16CE8F13C11012D5AED3E3B858A63026CFC0E839507F58AB688A8958F614AC82164F4D2750A9226E90804C14E091904D1F9B5312EE2CC78E7D180D105EC35A61B3B8C50C825308ECE01081E1735AB3DC873E265811EF38421D3B72D9ABA4F150F45615BE5DC9573F3150D91B46552E32C6103DC72FAE7431348A2B6D9F413B4C0F805B2232B7DF54CA1333A8B57BD1BE78206AC56D4FA2FBEF96F7B59C053101287541DA7D9A8BCB6C2B23C9023A466147815FF1ABA6FC8C74CB7966DA0E4767363EAA523A59A7AF54D24B67BCA70144FD232480981C251820AA3007C92FFBC9F209B2AFB2F98EB3167AF2A15572DD774315B320EB931D35C31A802B0A3DA4A12E2E51F ct = 34BF8BCAED2AA180DB6ED5EC5676FA97ABE9249A9B548D2744A41F871AE6BBB828B0B797BEC5765CDB3C536A658171A5B4D27596D65BCF60960E042FEE80127EC143E33923A35839385E2CA58D990073E766B8ED0474C685C4E11BA29D8B91A6F3C0ED66F717FE826B7147CB440493506D019663C008EDED9B148DDC2C01E1CF1A4E42A7251C09D05430A036DF4A84C7BE282E3477AD7EBCB1232A8FA87A6533F53E0FDC9A847F2E17E005B614546B268EC338F41327C25DD110C20920D5757F57AD4A0E1833EEBD7E28BC71079898F9A713A7C70C29C2131B83EF8C3A5953B20D792B74076FA486F25B71AB15EEEC72E35EE66699270655AD688927C1FA194F171A37C10795F1238C855786246456F5AFC00933F0F49668F2BE7131211B497ECCA8ED1AE4073349D9399420107C7189E6DC338458D3D67C0CC83E1DCA1A304834562E9AAFF2C7F6B02BC11C7EA54B41181F45EF1AF9826EB438E72A5632A73B5357674F4F48D55E9777164F1E4A806044AD93B960546553EC10B3229BCF3760837B2B5FE6DD34379DE19887500BE32A960E ss = 8FC5CBFB343088B5E6F1EB63B61CAD1F count = 14 seed = E2819EF86853BCA1B9DEE7EE1C1619988964F9A913E635AACF0D96CA6E0300D084329DABD8F149E24176D22757404260 pk = E76D7D9B539CF13308F26100C65260B9EFFC236E588024FDA48C8DB2221F7AC47DFB5FABF41F788E5F3AD3FCF3F87BE7D36B69343A70735B186CCD5D98843B0DFC91A10BE0D335FD62477577CEA0FDF011A15DA810F560EEFE64E8352B11753523FAF018B413DABEBEF987EB8BE5278D083DBC471E6892AD870EF434B30077C442101E4680983EA2B1D8581B19F40EC5C755BA8F5695F7E78E63D1850090FC4156442123E77D406E0526EA56D73694F06CB3E3E964589C5403538D0D007213964C2F10F87702C16D9AA7D10151A0BB4F6E191AA88F6739BF61EAF91CA84C37C639C2D5787DEA5B90554135924CA259FA430507E0EFBBE3A2AD8B90391708CF4284D46CAC25A0B5178E09062E580FE3156D4FEA3207C6934C33FB35645CC03BABC2970C664F2CFF38978E0ACD31B3CDE0DE06E996A31E5FA0AA8B08A6C1CFDB7AAB6309E5C2797B251BE2ABDC9C624D694B8F163B0D5ECF02DDB4516515015B25BCC60929ABF231473D7AEF17EB0D12978A1586BA8950DABA5C10 sk = 38A0D5F41D7DC1896EFD1B45B0485634CEF149828751B960A2ACF359556DF4A2ABAEB9DCEE945829BEB71185B4D6BD18B76E5668F253380AE76D7D9B539CF13308F26100C65260B9EFFC236E588024FDA48C8DB2221F7AC47DFB5FABF41F788E5F3AD3FCF3F87BE7D36B69343A70735B186CCD5D98843B0DFC91A10BE0D335FD62477577CEA0FDF011A15DA810F560EEFE64E8352B11753523FAF018B413DABEBEF987EB8BE5278D083DBC471E6892AD870EF434B30077C442101E4680983EA2B1D8581B19F40EC5C755BA8F5695F7E78E63D1850090FC4156442123E77D406E0526EA56D73694F06CB3E3E964589C5403538D0D007213964C2F10F87702C16D9AA7D10151A0BB4F6E191AA88F6739BF61EAF91CA84C37C639C2D5787DEA5B90554135924CA259FA430507E0EFBBE3A2AD8B90391708CF4284D46CAC25A0B5178E09062E580FE3156D4FEA3207C6934C33FB35645CC03BABC2970C664F2CFF38978E0ACD31B3CDE0DE06E996A31E5FA0AA8B08A6C1CFDB7AAB6309E5C2797B251BE2ABDC9C624D694B8F163B0D5ECF02DDB4516515015B25BCC60929ABF231473D7AEF17EB0D12978A1586BA8950DABA5C10 ct = 2F779D6BFF4BEBB201AD67BAF96D9D9A0587142098C8D796D31B1BFF435A835FFFFD87C0BA52C44B14E5CA30F4BF1F43696CCF7F009EF51C5179B76534AD34E617CC25A6264951682241CFB43B24C1D9E944E813C6644DE322B9594A90B42926FB7985D1B6D5A11CDBE2B4971AC53A22DAA2ACC8FAAFBFFEBA6ED720BE37B2326DF4439C8BB03FA87BA174BD8048971EA3F14A636E3E2C45806AFD35395BAE8277BC0EC512878775BD8BEDA04CCC32637B4DAD69EC3F489C82E710F43B371E4449841796451D77BF925B51A8362B2731AA7DB34BAA2A3BB031A7541530ED0A7D16673BE56C6EDCAF253AD3D00EC74991ABA4AF36FEC2827AED18E83F8F7D9ED8861FF81F185646D28CEBB838ACD26ADA77F423F30B68854B05BFDF8678F43DA019F861FC53E0C73FE1B2BAB55C7F44509180E7495CA509ABB661342760C7A803EDE1BD0744C817F67A41740C8F80D1FEA08D4E93D02673CB3F442BF7B33FBC2DB519A2355207FD1D2EC9482006EC523C243AD5E9AAC5CA1BBE1EBDA19585C7B23108DA502F7EA3E52C150A7A6E74267EBD8B ss = 924D938AF87AF4A5976041E0821B3CA7 count = 15 seed = 669C4EF8A051CE201DA65FC4BC34D398EC1F806276FC5D987AD71D93BC12DC8F107B58BE6E8422A0795C88CB9A0E7488 pk = B1D61ACFE6278A696A3B275EFE297ADE451287FA6B4B2E9A95367DCC2F3914975D151BD872DCC15D927AD28981634288DD7EE855E0DB4628AA16660D57DA104132CB55EBC045969EA9051E10E07CB8C0E5D62D0D5B339FA9CAC90A37BC381638042312769F6FA92416A4B3699E0CCE1275297BE5926876FF656E7962CC1559DD78AE0911E096AC486A07FE1116FC12C39812CBE50480EA63FB585DCA5ED66C141DF75216A10143DE5E1D1EC44FA4366A027F259A1971F57D441D3ED9310EB8B9068136175FB9FA7FB2E5D917FF92D872389F2FF8451D7841F740A0DF7FE05E5CF1C72F13F4208C7A19FD42F58070ECF9CBD7E5B1DBF9A1751C7E262358F0A1B08C1F882E98A19259105157B7B55DF59BB302C2C7FF42A21743121F91F399969A81BD7130B7F770C80BF28ED060331B42422ACEA37AA203DDAFF939DE335EE9042B09D50D6E7A6A2E599C931B7B2A469D1B6131FB2C7631BF9D75BC7D59D1E9D50C7B5ACED93FEDA516709EB96394516F123D9AFEDBD613F3F93E sk = 97B5665676E59E3538EBADAA8CD50DF1F9FDA1502D9894C6DF05318B5F655EFE36F1B678CF4B875108A18DB2FA312261CAF839F84BD95605B1D61ACFE6278A696A3B275EFE297ADE451287FA6B4B2E9A95367DCC2F3914975D151BD872DCC15D927AD28981634288DD7EE855E0DB4628AA16660D57DA104132CB55EBC045969EA9051E10E07CB8C0E5D62D0D5B339FA9CAC90A37BC381638042312769F6FA92416A4B3699E0CCE1275297BE5926876FF656E7962CC1559DD78AE0911E096AC486A07FE1116FC12C39812CBE50480EA63FB585DCA5ED66C141DF75216A10143DE5E1D1EC44FA4366A027F259A1971F57D441D3ED9310EB8B9068136175FB9FA7FB2E5D917FF92D872389F2FF8451D7841F740A0DF7FE05E5CF1C72F13F4208C7A19FD42F58070ECF9CBD7E5B1DBF9A1751C7E262358F0A1B08C1F882E98A19259105157B7B55DF59BB302C2C7FF42A21743121F91F399969A81BD7130B7F770C80BF28ED060331B42422ACEA37AA203DDAFF939DE335EE9042B09D50D6E7A6A2E599C931B7B2A469D1B6131FB2C7631BF9D75BC7D59D1E9D50C7B5ACED93FEDA516709EB96394516F123D9AFEDBD613F3F93E ct = 7ACDBF7B9633A565956B0B7FCCAC3E86F9B58DBDF848A5CF0532705DC906B5AF4C0548FA7401E210A07DEB41C79FD6E9197D56E7C2CDCB2943519793F0E02F066590716AC0E82009C058C3A71ECEB7187619FE9A2E0D739B3D02E803D0FCDBE8E11A96AD2EFA2FD99CCBCC56551C512447D361F922DAA65011EE9CC09A3DF905DFA737FE8D2EA3F0B112E71520FB3F06EEC840EEAD37D23EBB8AA0C5DD4ECBA25F06C0232B911C23D0438DFEED1A8CE8EDD414453ED59A5F7C49263506DAAE3F6F6A25C4915FCF1EB5F703B94D5984347EEBADA4B34EA8C8C0DACA84DE012418D90FDCEEA5C25AE405CB1D62D303FB904AA38D80F34F127A6E6AE20832230DCC7F78D7AD186E81B2D580DAB9BF2EC4FB64FB511981BF46CD5674B82615110566B38B0B4AAE37A6B6915505B003F4AB97B07405E347B1D2CFF60F263009D6489EB93118A4A4C51D8BE13AF719DEB06190ADAE3902931DA5EF753B0D2A9318F0938CA6B597C609816C340A0757FCD06F0AD477C15C7DFF689C82300B1502F57701A16E34019924E28B83F5607EB56CDA01E7B1 ss = DF8970518FC6B152F4769FA78D2345E1 count = 16 seed = 9DEBCCFE818F6B5204DB4EA09C03EC9A19DCF1629C1527685B8A29776BB1DAAEC45F8ABF8F0ADC9A8C8BD6E2DF6D8048 pk = 41965EC2EC7C85707324F6E9838A40D7BFA337BF7A82F4678A67A67FEB02427A0FDBC201AEE06BAB6F85FC9C0DE6F5840C45E3D582EDB344D462164928523F704A6306EE4FEA3BC4004C204EC646DC72326AD08D78DB938B996B0A5C2BF437605F8F5230235B1857A6BB58DA16102F270F80BE943D4E7E0BFC01BE1D3903922E2EAEDD9372CCCDD3A2A1FE9023B024824EC60162D1A73D1E464F01DD059A551A02F5BCB5C68807E820819FBC3E58AA72E2468682F5E2B505C6B5B282065FD85B36BF644DC3A49BCAE6A74E218D49BCC095742BC838675201AE21C27B931D791140A9B40C85A59356D0EC073A361A8A226D7369C762DAC6EEE2E1D02A88814B7EB6D25E35AA600E18B386F2A7451C7ECB9AE614D6A606B7A57F3427A84DCB7BFB67EFBE4927B71F20CEA9F1C3B33EFBE7A1C703696DE52EC53814250BE0B1713E65D17E38EE253A9BCF8C64352976748FE417A817BA09D02FF7E970C564D144AB064B36EA16E6E38ACA1D305939492C1D7C1B4CD0D7AD4AF5EF09 sk = EF99224A03A85A46EF115474EC5B5D620DA6795D6EFCCA4CDF7D92DDA83E6B2EF4CCE08C9134563063068A196D7B1A1A13623E48AE12520E41965EC2EC7C85707324F6E9838A40D7BFA337BF7A82F4678A67A67FEB02427A0FDBC201AEE06BAB6F85FC9C0DE6F5840C45E3D582EDB344D462164928523F704A6306EE4FEA3BC4004C204EC646DC72326AD08D78DB938B996B0A5C2BF437605F8F5230235B1857A6BB58DA16102F270F80BE943D4E7E0BFC01BE1D3903922E2EAEDD9372CCCDD3A2A1FE9023B024824EC60162D1A73D1E464F01DD059A551A02F5BCB5C68807E820819FBC3E58AA72E2468682F5E2B505C6B5B282065FD85B36BF644DC3A49BCAE6A74E218D49BCC095742BC838675201AE21C27B931D791140A9B40C85A59356D0EC073A361A8A226D7369C762DAC6EEE2E1D02A88814B7EB6D25E35AA600E18B386F2A7451C7ECB9AE614D6A606B7A57F3427A84DCB7BFB67EFBE4927B71F20CEA9F1C3B33EFBE7A1C703696DE52EC53814250BE0B1713E65D17E38EE253A9BCF8C64352976748FE417A817BA09D02FF7E970C564D144AB064B36EA16E6E38ACA1D305939492C1D7C1B4CD0D7AD4AF5EF09 ct = B44302AE0EF1CE42B8229D84F3997A0C2D891D609223B92475DFA79B17060F0A641DDF33916637D293AD19166B452FAFE881A2D709913A91B7FFB5A547982CAABEB96D928C0EB25D8C85BEFFB532F987B4AE62C7E68DC8173FAC5899AA3A5D8A30AD47A25CD26E058F9A79D39D12857F07948DECD280F59B354319980B151ADD015D7ADEF48F8AB7DE9FDE4FF71720BD9BD4D32BE9F943BCBB27C45BD2C9B185528BEEB1F43C3DC4B2D1B4ED7F45A274DF00771367FCCC516758C32706C8648F4CF77D76E8C93C3956C8306023423E87DC7A79BF156B645371763F0D20497AC306AC842B60CF962BAFC730231CC2510AB58828CAB126AB5B50FB25344315C7658A5E00822E562EFF2E08D2477FDD46A872FE13DDC6E3B2E4B8B58D20E5F2A5598CE7FC79086EA59BEB2C2CD06E45499998C2A332A344C01430243D70B546C146B0277C8AD4BD414B1F77A40BF67EA661FE6DC9792E2D8B290E3768107C7CE03CF20A387B3C688773AC11FDB0CBBBEEA1148F9D04B28EE95FF810899C7F44FB51020462242F96EFA97E9CF23AC54F18D9EB94 ss = ED12EE03261E16E8F5E901F69BF972A8 count = 17 seed = 8098AE7A92C10F707D405F7DEA02C2EFBEF44EFA132BA8AEFE81BD45E543ECEC74F10920AE48A40B0653D63532517F2A pk = E6700C084D5E0DBA0085A8F8AB6ADA981B7D24EF1754A82E83D4475D67D1174D497B10AF7022298349FBDFEDAB31085BD7AC9F9E7A898EAE45C8DFBA2A461EC16DC46FE82E925B21C73A0EC7F1C546D4DBC1883C8672876375644175A7370A1C3FE3C7C22B28167E5E9F8CB8081F52C7087CCD941A1BC0988291C6AFC62AED56BAFE4065A6C40CCCE585D4421166360E839A6E86E7734110D71F40334894F78A9E489DA24D57E3F3D078EF1F22C444AB04F1F8F4EAE9513F76079656235196DB886209027C56DA35DDDD9658DE111183F18D8B2813A63BBCF57D21AC4312D1C15460891A1D38620CB8A89C3060449BB63BE4707F04C2037B091BE802A05AF2F1F50D8DA67B60EC5A5F490FC781FB444661374CEF2699B862791978514193737FE7805A7609AD7083FCA5D3E3BFE038262C086671AC74868CFF521698C59BAABCA808FCE635001F089A518289DC581D2A21A462BEC5F13D2129395BDB54A64D50FDE8768028BE40685CBE0B73DEEBF4FBAE1054B790EE5A216713 sk = B12F6FD965EA9C5B947DB80FC60C83D5E232DCA82E7263020F6AA3E88F7FA8A96067F8CDAECEEAC90C2D0B5E277E56E9C405EC9420C30202E6700C084D5E0DBA0085A8F8AB6ADA981B7D24EF1754A82E83D4475D67D1174D497B10AF7022298349FBDFEDAB31085BD7AC9F9E7A898EAE45C8DFBA2A461EC16DC46FE82E925B21C73A0EC7F1C546D4DBC1883C8672876375644175A7370A1C3FE3C7C22B28167E5E9F8CB8081F52C7087CCD941A1BC0988291C6AFC62AED56BAFE4065A6C40CCCE585D4421166360E839A6E86E7734110D71F40334894F78A9E489DA24D57E3F3D078EF1F22C444AB04F1F8F4EAE9513F76079656235196DB886209027C56DA35DDDD9658DE111183F18D8B2813A63BBCF57D21AC4312D1C15460891A1D38620CB8A89C3060449BB63BE4707F04C2037B091BE802A05AF2F1F50D8DA67B60EC5A5F490FC781FB444661374CEF2699B862791978514193737FE7805A7609AD7083FCA5D3E3BFE038262C086671AC74868CFF521698C59BAABCA808FCE635001F089A518289DC581D2A21A462BEC5F13D2129395BDB54A64D50FDE8768028BE40685CBE0B73DEEBF4FBAE1054B790EE5A216713 ct = 95A10E00252F43CE70C6D8C611843289A420463E5E17F1F331F2FB1DDD98C5CAE3765583DA915BD620DAACAEFFED3427D264FA88258318476E3FD527B57215E5CA3A06AAC005663E3E78A661B465B48C5F0EF5B06A9CCC1806FCE0CF154CA880B26B1D7E26737A6210F912B9B560C2A39B91937BA0D5E0A6C109AD3FDC3458C691ABA933DA7E8232D88BB16F097285129DE0CEA87564C11F9E5FECF565D9550B457CBBB9372F8DFB3D55D603CB5D11CD12599F96D4B64D19D17AEFCB26672FBD48BFB54E9471F9C8747AEBFD44BA0AE9B7CE86D946B5EDEDF9DDD419E38BA26B93A1BB7F3BE7C571164C07739F4FE3A3A199ADF3C607C9DBBF064D2CC51D48C38CE921604CE70B92BF7752F71C5C0280306AA92E6DD1986D7184C2DFD2E1ACAC4425EC8F1D26013D98073C53FF3D502D07D748C92007A01452D31288F3BAD954F6BC6D0C235CAEF7D0E460F6547D7A5F2B458E76D9D9AADA0E6D6C9B413F2FBB97E89B62A1DF40333F69C8CCD3727B9AE9D6C6FD87F922174426787219DA16BFA20919DE8ECEF4258A969603955C5D1DDD74 ss = EDDBBE6A8F50E7358834D8790B68A44E count = 18 seed = D5F23808871544E9C1D6EACE2028362B48E225312F77663E9F78CAFEB512B908CD9E25875D61A16EC615F4B8FF826856 pk = 69C1C4725722EE8457362775DBD1A20D2BA8407F173801AE186A61EBB19DA21612F05DA6F6684E6B953AE0913FB15DBE22E7DD7158D04F422EFC4EF9B7E51591CA54F966508795E383160436BCEF9778ADCF592101052B8F408D2E07FB0FAC4372765E4352A3168B69AE19DD5E6A1C0BFC94E69C6059BD1A43C0EB1EC21194947DB578CAC39199B161DC594D23BA3E53B55BD51ACD41DDDDD807C3AFA687B622993B89DC0A97F725B0C4AD72AEDB7B0CCBB05888A5B557B9CF3C508F255CDD8C464B4FC2E42C8BE545E1F08EB007F27B68E603EC65C940D0C00063C9C5B3DBB6FFD496E74EB62567772702BD35C69ADBD7D839D2893C1DCDEFCDFB250D326F119B0BE55EAEE6DE68C4C61C44EF0B18B2625A1DE82FC5705AD73C0F84037BC3767BE3241BFFF5F972D86B5297EAC9FF597E03DE66B4D8126672DC2D5A30BE4E04793C3AC727669B1F4DB6D8235BA5D4235A757E9D4D67B8AD9F9138589EFF18554F5BB595386A135ED704AB86A47BB10161D664A145B8C98E2504 sk = 9F52AF92CA165FDC38788F2B59BA02E01C8281FF7C1E60504F3029E1BE4E1C0258C3A22FF5B50B2674CC094BA7018DA2A61569845C17D20F69C1C4725722EE8457362775DBD1A20D2BA8407F173801AE186A61EBB19DA21612F05DA6F6684E6B953AE0913FB15DBE22E7DD7158D04F422EFC4EF9B7E51591CA54F966508795E383160436BCEF9778ADCF592101052B8F408D2E07FB0FAC4372765E4352A3168B69AE19DD5E6A1C0BFC94E69C6059BD1A43C0EB1EC21194947DB578CAC39199B161DC594D23BA3E53B55BD51ACD41DDDDD807C3AFA687B622993B89DC0A97F725B0C4AD72AEDB7B0CCBB05888A5B557B9CF3C508F255CDD8C464B4FC2E42C8BE545E1F08EB007F27B68E603EC65C940D0C00063C9C5B3DBB6FFD496E74EB62567772702BD35C69ADBD7D839D2893C1DCDEFCDFB250D326F119B0BE55EAEE6DE68C4C61C44EF0B18B2625A1DE82FC5705AD73C0F84037BC3767BE3241BFFF5F972D86B5297EAC9FF597E03DE66B4D8126672DC2D5A30BE4E04793C3AC727669B1F4DB6D8235BA5D4235A757E9D4D67B8AD9F9138589EFF18554F5BB595386A135ED704AB86A47BB10161D664A145B8C98E2504 ct = B25B2CBFA381395BD92103F1E1783DEE4BFB0F1A3D42C5D5C1549CA644004DA0EA68F16D5F622E85CBC46508C1843156DD82830EA4C9EAA97787741A8434176DA1A4524E980A990D0799E0E0C49B6353BBD7958A0F2D4D3F93538EB1DC01133E32A9B86C9CC58F133C126350BA3B8B0326A4C12BFE7B8FAF5388BDDE0201E969EFD541DE930EE27FD93AB2EA32112BBEA06A204FECFE6C4382A67D28E15806274C1CF78DCA2F660400B0D9A28AE4D161090985FEEADE44B3616B150D03A6A69663E5B9C22A3E033CB7F3170A62147751F729D3EB47BBF7A3CC9362E554D7F7D062EA39C414958B892E74F905E22A0747FD0CD98E25072005B689B20C2FAB1DC1ADEB877D8215857260D2EFD04A8B22C5C1FF0A5EADE0B513771E883200A9D608443220BBD14A565B9366170D93BB9FC3B37CFAB2092F4F10850E3105DF2C0CF3BC6DA0D1627A51EB70745F64AA44B37C766B9206CDB5A34CCA5CA3406BBEFDEEE40932EB5E0BBBA0E994B522279BD50278B17F7CBED9254DFF37AB59CEDC4DE34F44168EF35635D6E53B0FE329BD5520D96B ss = A9C01E4872F2391F9F7749816C2A6926 count = 19 seed = 822CB47BE2266E182F34546924D753A5E3369011047E6950B00BC392F8FEC19EA87C26D8021D377DF86DC76C24C5F827 pk = 2D927E13D371B802EB8A8073894EDE917CE3F133CF940973D62800496A99DA1ADCF584208047923F8D72E50C1F84E98014D25F42C9C0BE9E0EED134E8C5E29D2EFEDB463B5FB4050B982415CD7C83AADD2FA30BF363D0FEAD7DB85576316B21E7F8A810E2BA251E1F1FCCE9EE0BC64C7159231D39957727A53601E47F61F99A43900E2B5F4AD03D26C83E6153FE622136C79EF0F586276DED3417B0CB1C21B265ACA2A527813969D71D24E3A2C2A534386CC68FE7BAF4F8C7F28ABE00F42E4823D5829257C409AC3A7E2B9519C0379B813BEFDCF6A3B8B2CEBB48E3946FD89C1A646ABDC7CDD8B4B8ADE0727FA8685422F2F79481FD9A4784E36D5214FE68ED63705F2FC8309669E41234BC184C9DF6852BD888EA6A33D8A4E4743FA730D1FB5924421BA8999220A8A502E31C7772F1712B8E59EE65D78E2F4DF0C55461D98F0CA5866F353A7D62398A137D7EB4F9EF9E40D5C65EDEAB72868CFFC6526FC71A46589E78AE4CA89EB616BD620B16F27C48B037746307FBFBA703E sk = 851EA90FD3854CBF28FE39FB81F68E4B14345CF0D6EEE7EC1C0EC046899A777655233E4E1B5CA44E9AFBDC67964BFD5D5E3DBB45E60D030F2D927E13D371B802EB8A8073894EDE917CE3F133CF940973D62800496A99DA1ADCF584208047923F8D72E50C1F84E98014D25F42C9C0BE9E0EED134E8C5E29D2EFEDB463B5FB4050B982415CD7C83AADD2FA30BF363D0FEAD7DB85576316B21E7F8A810E2BA251E1F1FCCE9EE0BC64C7159231D39957727A53601E47F61F99A43900E2B5F4AD03D26C83E6153FE622136C79EF0F586276DED3417B0CB1C21B265ACA2A527813969D71D24E3A2C2A534386CC68FE7BAF4F8C7F28ABE00F42E4823D5829257C409AC3A7E2B9519C0379B813BEFDCF6A3B8B2CEBB48E3946FD89C1A646ABDC7CDD8B4B8ADE0727FA8685422F2F79481FD9A4784E36D5214FE68ED63705F2FC8309669E41234BC184C9DF6852BD888EA6A33D8A4E4743FA730D1FB5924421BA8999220A8A502E31C7772F1712B8E59EE65D78E2F4DF0C55461D98F0CA5866F353A7D62398A137D7EB4F9EF9E40D5C65EDEAB72868CFFC6526FC71A46589E78AE4CA89EB616BD620B16F27C48B037746307FBFBA703E ct = B5E4A96E9BEED97A881440F8B6B774098602E7E22F071FC92D5C5A7935F0A267476B39EFC86AFD5B8670C461766BB77C102E0F3C2A06D7942CE3BD1E242801D56D4589B8305653CEB1024F527785656D64BF3F28B444D21A82A042DDC60369C3B706D568E610BA736F6AD867F1B6800E698FA9AFCD9AFF474B33536C37203B0FD37F7393FA2D1645243294A07130A6308CAA31F7AD2B8E1E8D04F1BB3B87528D44454FB52038A9F94FA9D05F8C30CE6B32F47B0ABC6C0CBE652495B50A6474C5EE83EF8F0E41FF9AD540417CAFB9DBF40CC8D7D973276D95F3216DEB7B5D51FFCD81075254D83E60FC57745FEE5F46F76C25886E8286A5769ABEC530F58A6CBD0C6984C3765E42032FA5C9D2FB31DB01FB3D25451E58DE159DB7A1316D670CA1D5D046CC5721579F186C34BCF9791A4812D9AEDFC95BE677CE1F291F585EE036FF2A0B2373F016B44CC3B390F9A4519EE44F68A60562F1D36699A896718C670388E3D454D3089AD8B5A9F69FE858EDF91C2AF35ADFE73F0F8E3A156EBB129AB038FEE14568DB9E13EB2B0446FB429B237EDB ss = F5C3C0F67007E4806C1D082B2A663508 count = 20 seed = 81401DB81138D6874E91B7C11D59596E4ACE543F5A3471B6FB00999221765FEC3CA057ABE20F03B2D59003375FD71FE8 pk = 88B3A00FD10549FE536D5ACF1511CDCF197B974AAA3F78ECC77B24AA98F8F52DCC479B36CC855820DC76B358486FD177ED3601FF8BD6F741E2F9DD47B50840C8083D688ECF125F16688B54B38019195C504AF534D97FAD59F58E730CD3486CB120DA22DD9D526A4EF5B35DBE0F2BD07AB78396458DD7AE8615AC279D8A27FC83480B31A24312D5F2DE3961C6BB1408A415937C0A7A8F43CC380E05EE2C041338B3679709515725D54313024F234E77913E440F903A8ACBE6C0610DF50723B4D1BF8034FF6AC1007E96B8363EF383506CBA163FAF41BF5D634EBD75EC0052573E390704639CBF216199709E9856D0396BAE63E6AA18FD8BDE5EF83306F4262C264248B10815059B35B4B80B7DE998FF27FD5EEAAF346F442E09E4B988BDA212981D0654A03D88137F0459910431988F8E1BC6754E1D17826EC1FD0976281BCD14D10B60E31AE0FD4EE7DCB322771E70895425CFB76FC7FA610AD91E221766BE0B74BA944DA795475BF974E81A210FD883FC458A765307D818FF34 sk = D304C9389CC973477F169788ABCB9D511F843219D246A9B56590A2E5C7ED86CF2C5C2A898662BC9A81418720BBB632EF9CF0B845ED052D0388B3A00FD10549FE536D5ACF1511CDCF197B974AAA3F78ECC77B24AA98F8F52DCC479B36CC855820DC76B358486FD177ED3601FF8BD6F741E2F9DD47B50840C8083D688ECF125F16688B54B38019195C504AF534D97FAD59F58E730CD3486CB120DA22DD9D526A4EF5B35DBE0F2BD07AB78396458DD7AE8615AC279D8A27FC83480B31A24312D5F2DE3961C6BB1408A415937C0A7A8F43CC380E05EE2C041338B3679709515725D54313024F234E77913E440F903A8ACBE6C0610DF50723B4D1BF8034FF6AC1007E96B8363EF383506CBA163FAF41BF5D634EBD75EC0052573E390704639CBF216199709E9856D0396BAE63E6AA18FD8BDE5EF83306F4262C264248B10815059B35B4B80B7DE998FF27FD5EEAAF346F442E09E4B988BDA212981D0654A03D88137F0459910431988F8E1BC6754E1D17826EC1FD0976281BCD14D10B60E31AE0FD4EE7DCB322771E70895425CFB76FC7FA610AD91E221766BE0B74BA944DA795475BF974E81A210FD883FC458A765307D818FF34 ct = 943F932ED5CAA77B360202D8930AC90EE7651A48D62AAFC045D0CF8A3A39D7CF7241411099B9788C9DF8C2EAF15CDA9C6FD9A70008FB12D7284BEB33E35C19D55398370ECD70720E42B80C0050725E207EF6EB02EEC52475B4F9A7522535FF2FF400651B2388A7755386800A978182AE2C4E3382A1FE7D49E36F53E8233E471477D6FEF00D6866344B2739B2B19BB536699C103EBD43409B7B800DDF1710C4749E8BFC2034455433C78BB1C585ADB13015E318BEFF45817789DB6141122252B2BB62CCDA067261A2772909209E5994CF7DC490D2781BE37DE754D3382A10D074B7E547C93DA91644CED018DB53BBBD105B0A84A6E0AC60A0320C8100946F8FD6D9420B4C0719DCC0D8D709BEB98D8625980069E07A021A3B3CA5B7B9AFEA454BCC84CD6FC453C2BDF81AE1752E31B285574FDFC06FAB7AD6317D2024E3C090C8040CE3F915A00066856A77C04F044E9DEC74FDD10547BC4275BC53623A654804A401200B05D3EAC70BD4B21B1E1D827DE5A9541C7BDC7EFE0D10010367B9BCF7EE1BFAE95741B7E46D41C353F2291B51847F ss = 32F9704EC592C5015AE6F8B469FC6361 count = 21 seed = 30B5DE5B73681EC08AAA03F6F2D2169525D25F4042A5E3695A20A52CA54927B85F8BB948FC21DF7DEFC3910B28674994 pk = 0D36A1DFADECAB135266A11CA3DD6E418EC222C9111026A7F564347F86ACD0124152EB9FB12985701B67DEAA7385BD037F6034C2AB5B5D61AC9A2C4F51BC3B717BF3CDB0612DE43B30F2B40651CA115D60841D6577AE40C8FA00A1FFF80E32D52C555F49DCF8966986A8DEA1AC194B1D6FE8EB5A5F43872F50EAACA0933102EA1114D038EE34892EB5D2B78B94D478E6AF43CA4A0F1EC681C399C355ECCC098424E9DEFD9C113884856CFAE29EFCCD38686C816FFCF1A172ACE97C5E020B272263159961126E7771768181007CD3A8608FD4B4D80B2364328B8B71B501D5537A0215F2E21325AFDD5FD98EF46B77AFE8EFA6CB0EFF6686236EA4352CA4C4877F9B584042BB8B199217B5BA5854F0F48443BBF20E01143923686E2FA87D37AB3C138CA3796D24073566F82269013C12B41EDB06C435361818628B342DFABD00216C978B22C00C82E3BE0AF2D06F6C23F2226BCB5E1AD54F28C41294786C9D4C9F2DABA7F8944F2A1045284E30A4ABF4880CBD79DF720B64880B08 sk = 89A6E3BE304A3518FB82B18CA730F0B359CD6BA90664A493B6591121E25D64010C25A18676033E1D7278AC5F2D0B43A31F3A4156AE7104050D36A1DFADECAB135266A11CA3DD6E418EC222C9111026A7F564347F86ACD0124152EB9FB12985701B67DEAA7385BD037F6034C2AB5B5D61AC9A2C4F51BC3B717BF3CDB0612DE43B30F2B40651CA115D60841D6577AE40C8FA00A1FFF80E32D52C555F49DCF8966986A8DEA1AC194B1D6FE8EB5A5F43872F50EAACA0933102EA1114D038EE34892EB5D2B78B94D478E6AF43CA4A0F1EC681C399C355ECCC098424E9DEFD9C113884856CFAE29EFCCD38686C816FFCF1A172ACE97C5E020B272263159961126E7771768181007CD3A8608FD4B4D80B2364328B8B71B501D5537A0215F2E21325AFDD5FD98EF46B77AFE8EFA6CB0EFF6686236EA4352CA4C4877F9B584042BB8B199217B5BA5854F0F48443BBF20E01143923686E2FA87D37AB3C138CA3796D24073566F82269013C12B41EDB06C435361818628B342DFABD00216C978B22C00C82E3BE0AF2D06F6C23F2226BCB5E1AD54F28C41294786C9D4C9F2DABA7F8944F2A1045284E30A4ABF4880CBD79DF720B64880B08 ct = 3C7B34328DF6A1536F61EE5780E05C6F53BFE82098CE86E6C15BD8B267848E84FE787CE6E538A4A3DDD8F7F35951E265394E6D1A0CCCB81FB80389FC5BA13FA5989F1748331E03B119A9513FFD7896A86F1683858986BA89BC09CAE30D76F040CA5032C56BBB486CB2C08B36AA827B8CA7A2C093113271044C7022E5D43F9B67E8201E6CD6C69C432CF1B023AC63C386D9508B728120810D8C6BF0879A70ACE9D6D7CEBF93C0D120AE99E79E4C476B794CA791442AEB81293C9EBC761C6E9F98897AD6E6DAFDCD370CBCC3AC300245C595FAA3DC987A45342B567765795A4FFEAA75C13C2DA2CD89E1066FC8873C64D0911D41D6DEFC991841A5BE0FFB6BBD36C2573B2CC31464617E6829D579F1BA7FC4E051F61E143FF3D6AFB2165F5AD05747BAF6278EDDD39EB7398F03B122C70D0C999C9B141A4176DE0E2C8546EF78574B024F17954B35114C55CC13CC99FEB320D2407B073CBF172D1CB2779A87CC390BEE43D79EF4AE446A7016C8A75E20C37D5F02AE39DCDB09113F89FBD9E19C24F56DE42FBA308F0CF5594684AD89D975760C ss = 503934DAD7D41FC0B4B1490DFF65B398 count = 22 seed = E335DF8FC0D890588C3E305AC92C7160FF199E07C85760A828933750E3FED8C83B0DBE802234481ECF890A32D7A2884F pk = BA263A507606C242B768D27CDF1AF22E9D01FB7684A540DCB145B396DCEBE5DF05EBBB3C3D15A9837B9E82F2BB1E591B1837248BC6CF70E8D974E66557A70AB5B5A945A0C780AE154EFF832D54BFD9194EFAD492A88A5163EB048D3104CF1DD981EC884BCF20B555CF63D42D75478C8C52E3FBD1DE4942325F89C5CF8E281FCE5C92AD18652A867D0CB2FD1CDF07DD82DE9718E3C334F6DA9881E020CF94477B296947CEEFD7B4C566AF65528BDC06E4E63AFDCF2693F15BC01BF3C33F9443D363CB166A0BD6A10B27FD7E0D077B3B47608E6D47467C9FFDF402D6D5B8FAEB3785913BD0EBABAD608B2CEF7B4CC734C1750E4C0AD45EA482FED90E03D09A060A1080D2519CEE61819F08E8F936228CAD5CD1F84EADF7ECA3271553CC4430032F74B64DE5DF9E0FA748C392EF4659FAECBBA9E512CEFE426E4E321122DE83D42C7D613F3C6CA6D78AA235BCCC5FA2E80160F41B4BB881ADDA1E1CE7BFDA816D6FF2D3E3171625BA0DC70288F7D714737495307CF9FF2D74924416 sk = D569B935CE015C85F792F8F7FB0D83C4F53B492959361DD476EAE84D11C4528382828F7A689A0D5CFF87B8CA0BBA97FEACB39B935A87880BBA263A507606C242B768D27CDF1AF22E9D01FB7684A540DCB145B396DCEBE5DF05EBBB3C3D15A9837B9E82F2BB1E591B1837248BC6CF70E8D974E66557A70AB5B5A945A0C780AE154EFF832D54BFD9194EFAD492A88A5163EB048D3104CF1DD981EC884BCF20B555CF63D42D75478C8C52E3FBD1DE4942325F89C5CF8E281FCE5C92AD18652A867D0CB2FD1CDF07DD82DE9718E3C334F6DA9881E020CF94477B296947CEEFD7B4C566AF65528BDC06E4E63AFDCF2693F15BC01BF3C33F9443D363CB166A0BD6A10B27FD7E0D077B3B47608E6D47467C9FFDF402D6D5B8FAEB3785913BD0EBABAD608B2CEF7B4CC734C1750E4C0AD45EA482FED90E03D09A060A1080D2519CEE61819F08E8F936228CAD5CD1F84EADF7ECA3271553CC4430032F74B64DE5DF9E0FA748C392EF4659FAECBBA9E512CEFE426E4E321122DE83D42C7D613F3C6CA6D78AA235BCCC5FA2E80160F41B4BB881ADDA1E1CE7BFDA816D6FF2D3E3171625BA0DC70288F7D714737495307CF9FF2D74924416 ct = 4217FB59FFA4ABDE6A9095497C964DD5E0D3FB1BAB14F09F7D39259632C08AD06823B7CAE69EA9F70B601BA3290FE08652B034EBD3B85C25CC8789980BB9240DE3C7C731879B114026D680D0F24703079D49FA26D04176457EFFB4E05FBD6A20CFE8459DF5D09732B27D5A79BC2AA2AEC4E2116F8566B1AD28D9E7BF402B9ABEB385E52B559278118410802554C6060E3728462A82D4B00D601A5FD2ED292C2640EFA04D9B5CA1EEAB829D400E98AB10B110F98876709D262DDAF57B1DA566ED8FA87ACE2EC9662A1243BDE01DB4FC3665CCF31F166DDFE6B1DDEF43AB458C88BA974431ECF653061D308B71B76666FB29DDBC46318FC107595A9622947B3C0C0E8967EA4A2D83D3E63C2FAB090E82AFA88159F39AFEE3D79044FD80967A62D7D93D349BFA49D9F129BCDF98CE746BF4194034BD669D39960760102B5273E2CDCB3F0EBAA1B77BC876874A2DE2F2D43DEA376C1C79759415CF98A558773871727EADA726629507D4C1D6D1AF8C167EEF6BC1AEAB14B355F6EB368EB94AB2533AC222BB1514AEB801A5FC0F175FE3A92F13D2 ss = B7EC19D26552CD1F9B8B3374B47F08EA count = 23 seed = FBEA1BC2C379F4F8FDCB0DE260D31CDB064C9EA9B1D6DFBE91B3692ADD1D34DEC9C9FFAE7BF5E72ED2743BA3F9F2E43D pk = E254187A203ED9D80DE5F5342661AA2027BC29523DEB55B5C5C6251F9CAEE535EBB9856010290E80BC0BF868EC513841514826637B339E6FBCDA6878F31F3DCB6A6152F8BDE52050F3B06F6CA38DC53D8F07214B3D7F286905451408EB453DE9E703D29D860A3F5F93B9839873A3CCDA1585B401A4A316B04444CC0CFB093911FD412BB69CFBDFB36BBBF1D6B99AB54B809040540E56853525416727D084A2B7AC52B793E78A7B9A95AD706CEE088C13E13CAC3804069909EC12D86D22448B71F3EE493A95D75623119DF86EFC7841407D232A2C93CA9C4BA438DC119E9AFC7694923C2FEE2A07E708408ECEB1DD043A43AE00886C7A0C2C23941405154148B1B0EEEF72E853D1D4111F5727F24630B9878C228E429C99231FD7BA5AE0A920F9D8A46102889001BF7C82191F5B5527F7E6010CCE1672174CA8140222217F45D5D13B888C8F3A9B42D476AC3DA974347677FC494D3D8A01B4C29AB8C3A232221812666B5B3C426977DF8AEB5AC40A5230DF3351EE262595A9D435 sk = 5CBB141C2763425C274F7404FE530D9116E08C33F9F200A2FC9EBBE336DC464489861DB8253606971BD0A9008A433ED17752D04023781502E254187A203ED9D80DE5F5342661AA2027BC29523DEB55B5C5C6251F9CAEE535EBB9856010290E80BC0BF868EC513841514826637B339E6FBCDA6878F31F3DCB6A6152F8BDE52050F3B06F6CA38DC53D8F07214B3D7F286905451408EB453DE9E703D29D860A3F5F93B9839873A3CCDA1585B401A4A316B04444CC0CFB093911FD412BB69CFBDFB36BBBF1D6B99AB54B809040540E56853525416727D084A2B7AC52B793E78A7B9A95AD706CEE088C13E13CAC3804069909EC12D86D22448B71F3EE493A95D75623119DF86EFC7841407D232A2C93CA9C4BA438DC119E9AFC7694923C2FEE2A07E708408ECEB1DD043A43AE00886C7A0C2C23941405154148B1B0EEEF72E853D1D4111F5727F24630B9878C228E429C99231FD7BA5AE0A920F9D8A46102889001BF7C82191F5B5527F7E6010CCE1672174CA8140222217F45D5D13B888C8F3A9B42D476AC3DA974347677FC494D3D8A01B4C29AB8C3A232221812666B5B3C426977DF8AEB5AC40A5230DF3351EE262595A9D435 ct = 016A3DADAAC208F3D8F27620EE042FA679DD4B6FE070847BBFC3DF0801BDDA8DAA4EAC86849392AE282B8DAEF58E6947C044049A9301A4D9EB5CF35185EE12C8A7F3BF7BB42ACAE7DC8FF9682E05E2F9CF2C9CA449BD7B8184F1C6DF81B06A6B4C1B1E0FAC5C3777422357E61550BCAC2A5D9C4E02D39FA5D42508725910691D5C2BD582BD80C7440651CF37F7945AB0D0745C35C4BAC215A7088111933E482A3CD477AE1DB7DB2D654C3C9398DD9BA0C389D86F4F116A1FF9570C7F32D8982AFF2959146A6E32E935493BE6E50A0FFDE5E4820044C94CEC9F6E4AC5DDCFE3CC715A42B25F15D704F5DF6E2EA2528DCBF897ACBDCC17243BF348A71762DC7A3AF1D44907FFEF0BFD7C641580D988D4F49D7719936CD01894E2D9C5D95BE562D083359CCCAAA8461966E6A1D60A7E94021AEB7A688529B5E2175F27E7EBD16A69D2D8C123924E6E4361E384A616FF732437C1094F344999C609DCA96FB1B88917F5A051738D9AFCE846CA6A30162085D74C638A6D875B2E3A350127A0AD970DB5C32E66490E1DB4AF6271E79251046D2862DF ss = E140EB4625F5D1AA558CFD1D18BF9552 count = 24 seed = 7E87FB886BC3C7C9FC12569F465D2ECD12532E76CC27C65644C8D3DD603B0CB2D036C5974E675058F271D5C82AD7A813 pk = 8A0D8E9972CB36C9FD118873F3C1FB89B724DAE8468FED14AF60934E42F27F5F49329430E771013257266EEF34ED34E29E9868CDF4C6CBE75F936E6985E32A6FE03700933E48459F455F349D004285906D4103FA7963EFD357BC68A41BCEC76F31877A5C2668AADC98DF0700A64A4BEB8DC443AACEF70F81F48C0064AC358BDC240DC8E1C9B93D75D75E02A396422C4284F87FDD783334E2213BCCABEA32E1B77701273B3B1CF56A74540E110FF9B4C86597D8F7EC78D1B3AB201C5A06F646EAD438A75F77E7CBB9C01EFF51BA21F89E022363C04E37B57D6029C1C3674F478FDCF467712669C74AA2E39F93CF2450FAE3FA9DEA124270D69883232671CBDE07B63316CD89B46FDAAD6A97455BCB8335F78F1DC23A4E8D9EA53A8F39A0950C53CE2A344A53BA2C1E5F01DEB8B5E4E9CE2291F5692C46C205D9B80340B084B943845318B742600C12FD385BF44DA933FD6C2B5FC43C5F3EA7F056C2C12F823E46F6B598A32C0A627B8F54FE267DEA0206E81902741120FE287E31 sk = 293ABB6D1C207927945417CF84883EF010823E11B487ED55FF8563038AAD865A817CAB9CE98846BA75BE9363718ECF5FEA538AEA90B2A5088A0D8E9972CB36C9FD118873F3C1FB89B724DAE8468FED14AF60934E42F27F5F49329430E771013257266EEF34ED34E29E9868CDF4C6CBE75F936E6985E32A6FE03700933E48459F455F349D004285906D4103FA7963EFD357BC68A41BCEC76F31877A5C2668AADC98DF0700A64A4BEB8DC443AACEF70F81F48C0064AC358BDC240DC8E1C9B93D75D75E02A396422C4284F87FDD783334E2213BCCABEA32E1B77701273B3B1CF56A74540E110FF9B4C86597D8F7EC78D1B3AB201C5A06F646EAD438A75F77E7CBB9C01EFF51BA21F89E022363C04E37B57D6029C1C3674F478FDCF467712669C74AA2E39F93CF2450FAE3FA9DEA124270D69883232671CBDE07B63316CD89B46FDAAD6A97455BCB8335F78F1DC23A4E8D9EA53A8F39A0950C53CE2A344A53BA2C1E5F01DEB8B5E4E9CE2291F5692C46C205D9B80340B084B943845318B742600C12FD385BF44DA933FD6C2B5FC43C5F3EA7F056C2C12F823E46F6B598A32C0A627B8F54FE267DEA0206E81902741120FE287E31 ct = 936A6E3E3FCAF5053B18AA30D9A7726F4714757AB0664C25C0226EA7576F394F0465F1ED5B55642B41A2FE8EC2D05E17A7590291539AEA3DC5BE368476E6137BF4CBAFADF2E6C7643D943BC0EFA1E32A313899B944E4F111792909692854EA37D7D3DCD0E6C213C1C488B5038D78EC7B8805F5F2A2649F7DB35448F74B17C9CE6FB2A4E9805777239374C8BA2546444C6D980B76046BA279E016796A1E5BEB0ECEB068A8D35ADAD865A389CBE4F206403399CCD5FBDF7929E3592CAD1F20453069F5B760AC05D71B7DB363F1A5FDE43F32C7313D6FBF9C19454B2C6650731C5A3CF8197F5E9E59856258291E849A77EE0B477DA84DC4E6040B16482AA2F7804B98C6738C566C4162EFD473C157603EAB1D4BC81F8716AE946A48E976F476290851DC86CAD84284E5566DFBDF3807DC293F096479E1874D9E74EA1173BC18B8B08388F09538C0DA7614735D67D91170E0B033FE63939BD681B27D1376CB4E94EADE81F1045C849AC591B33561CCB3925DE65DBB9690CEE1FCE631B25737E5FBD1D5BBE4580D5F83E6701680ED74EDCE727E1D ss = 4D8A2D9ED0982994EB99DB04B474652F count = 25 seed = AD1424E804F306C7FF513DA4C1E8D445AFCA7BC942FAC5C0B335733AAF70693712ECBDE26EA726EE0F9FD9D52A83B1A4 pk = 8279844007ED07AF756FFA31D2979D823E06B28B6BFFFCD81D49A77E9EE12B669E9BCBB55AF3A39E6C42FF646A4873BFC6B39C08E0A3CBB9DC1164064178038FAE82B00212DCDAB441E1A7C21111A21F43BA9364180703E5CD0660130787507C1D100AC7A70B1D6FC895876404833E5D6D172E2C276907EF144C19458A0F18123A4AD3DEC2AFE843D4FF5349826BEEF6D97E32E28695293750D57EC946E4E9F0DB3F67BA06CF8FAB2D51A07791981934ED692E7B5332EF4AE9853EE23EEA35BBAA49960AF04BDA02B9DA1D6AA17E0B6D7F9824775A58050B6511BA203F3A1C25AA150D7B3E6DFDE3BCD45EF19FF04FC9AF6629F86F741639FA534501164DA5B427BB92C45BCF422CB86E14E89D1F0C4A70E3F63CC17583FD2DD953FE1D9734CFC2D26DA0EAFFD2346E98AAA642A0267C734049236409D5B6BFA81F4390B566575741FD5FC2C4212FA4C8652E24E468A25D1D1A2A6170296E55F6605363D1EF1E92860CF0F756C3113FB735E4899F655088215EF00FC439A29F37 sk = 74D87C7556F2671F2D666854A4D6E073E69F35421E6E1A42E1FB7456AC0AA1B97068F452CBA64EBDC138BCF5D36B0A0FADA2A3B374141E098279844007ED07AF756FFA31D2979D823E06B28B6BFFFCD81D49A77E9EE12B669E9BCBB55AF3A39E6C42FF646A4873BFC6B39C08E0A3CBB9DC1164064178038FAE82B00212DCDAB441E1A7C21111A21F43BA9364180703E5CD0660130787507C1D100AC7A70B1D6FC895876404833E5D6D172E2C276907EF144C19458A0F18123A4AD3DEC2AFE843D4FF5349826BEEF6D97E32E28695293750D57EC946E4E9F0DB3F67BA06CF8FAB2D51A07791981934ED692E7B5332EF4AE9853EE23EEA35BBAA49960AF04BDA02B9DA1D6AA17E0B6D7F9824775A58050B6511BA203F3A1C25AA150D7B3E6DFDE3BCD45EF19FF04FC9AF6629F86F741639FA534501164DA5B427BB92C45BCF422CB86E14E89D1F0C4A70E3F63CC17583FD2DD953FE1D9734CFC2D26DA0EAFFD2346E98AAA642A0267C734049236409D5B6BFA81F4390B566575741FD5FC2C4212FA4C8652E24E468A25D1D1A2A6170296E55F6605363D1EF1E92860CF0F756C3113FB735E4899F655088215EF00FC439A29F37 ct = A558C101EAA95CCCA8F77EF84D78F02B24BBEA29A1750FFFB2B39D65D92233AC059BEBAE2F1CC14BDC06F36B8520C699B9C3353841DFC8BEB7CC7B8485A60239AAAB9E9768509CF5613419F8C777EF4FA526ECF0DB95C3E2A5803B91C94450E2D4650426C31AAFEFC8578F0AA636C645430A1B99DDBAA0BFE8E582AE68254BF3DC5B47828DDD9746F4679B413B36F5EEE1958C2365FBC11B9E61B943FC333E4548ED38CCF3FA9A3865F2F52881386D38774FD442F5A8B8441B6E6E5020BA62A508C5CF34463489F843CE8A03DF70BE4EA8BB1A25CCC56E78E36222B42E9B10575B2DC0C46390A4628C1944CDF678F0C37C1EC4889215440621848F3A5EDC35B210A9D03D76673F13F03FABFE0685399DFB2D63F27C188255513776ECBD20759C21F3D2742DA6F19F036869B9ECFA1A996738D7DE2597B08502FF3E647727B8F4F70F71829BA84C794815F67C2EDD4A0EC2DA465DAECFB65ABF7B1960A0A084C1D15A9613868177CE175D696C6F85945679983DDBCBE95AF16321B73D932943154C984C8AF76058E5CDC675B72199FFFC11D5 ss = C1E47D780D50986E263DD4BD763378A4 count = 26 seed = 7C33CA0E987226C8524DD56C811FA4D1CCF9995B1E4E4DD5B1481974E88CFABFBF6787775C2611CEFB27ED4403EA9B46 pk = CE9599CC6FBC1FD726E186FA7D4D44B642F7A69698CAE6B5DA5D30C6DD01D95554808827411ED0154F3D4D641B1E9DAFFDD0204F389900DA38D06354315D020B26A7502C2CEBD2FA830BE567A3B3B151A5065484BCF23C4008E518978EDE6AC321287198B2DD345D145027D4379E2AEF221D7AAAB60E101A15923574BA351B8B72CFA003854B8F9195433A913632DE93C00F4E8E47CC4CF4D43724F9A30951C94D7846684451C17176A3F3E886EE08E3A0CD19CE6A9C498C8B1077350B6D79BB7382FC0FB7E339643196AE5906DC597EEF5213723738017876B5E149BFD83942E33375A19F93C8E129CAC0BD783EFA5E3917EF1F8949246BCC10DC20DED4FE598AA3FCD5FF773E9447040281B8DEE853DF7E0F8514A272C79E0DB0F92C43AE49765BC086CB6326C66CA297C12A46C97E6070E0BC5135FC3C8DDE16343DB796A30FA71DEE9058230EB5D764FAE94B60A13BE648D8EEBDF22D9DEC9C019CBCCA8A9585B59D42A8F84D7E37FE367635CAF63F6BC5BCC706D81E6204 sk = 013BAB0212D04ECD54B478DAF72748003A25E2CB060BA6CC9DA0C5DA5F195B80FBB99C2E8B06926074F3F604B3F6195B5A5B9737876BBA02CE9599CC6FBC1FD726E186FA7D4D44B642F7A69698CAE6B5DA5D30C6DD01D95554808827411ED0154F3D4D641B1E9DAFFDD0204F389900DA38D06354315D020B26A7502C2CEBD2FA830BE567A3B3B151A5065484BCF23C4008E518978EDE6AC321287198B2DD345D145027D4379E2AEF221D7AAAB60E101A15923574BA351B8B72CFA003854B8F9195433A913632DE93C00F4E8E47CC4CF4D43724F9A30951C94D7846684451C17176A3F3E886EE08E3A0CD19CE6A9C498C8B1077350B6D79BB7382FC0FB7E339643196AE5906DC597EEF5213723738017876B5E149BFD83942E33375A19F93C8E129CAC0BD783EFA5E3917EF1F8949246BCC10DC20DED4FE598AA3FCD5FF773E9447040281B8DEE853DF7E0F8514A272C79E0DB0F92C43AE49765BC086CB6326C66CA297C12A46C97E6070E0BC5135FC3C8DDE16343DB796A30FA71DEE9058230EB5D764FAE94B60A13BE648D8EEBDF22D9DEC9C019CBCCA8A9585B59D42A8F84D7E37FE367635CAF63F6BC5BCC706D81E6204 ct = 289F78A97169C9830B2D998BDA6FA91A2AA7977CC9AB353382F7583AC2CF30D356D68FE166287E76258B6F20D13D56625E7EC496ED1F2133ECF21456D2F008E99AF70CFF77D796DB88E9E797BA70109CDFBA95B68B314CBBBE1117A92A266245A03180E90F65EAC133DE89A32F25B42C376ED2C13018828D6AC0748C563D13BD77DD19D75E8DCBF7AF484FA13B0874B82F7A5CF93BF931ED1A1F32EB2FD1CCA3EE6196FC6C6214FDB87CE278BBE17935E4AD4D6386109B46B51014AA360B3F0DA59B8FFA65D8C50A62C7F0258D1112C0C1D4C0D1B6793EBD65898D4EB8F0F3D0BC34D0F7DC72DEB0B7002B971CBEDF4EDD0624759C4F1AA86EAA8B2F75595719DB2350564F7DAD681ED09E0836E01B39B704D5882FCDB8DA2774BB2187E4EC25B3AEB30E47A32B312B944E6467D292EC5AF5B16FF970F44C49913095346FA5B36928CA2957F3989AECAA36899E3B14522B65E6BB541FF27F9E1EF470E3C738A26F67C8DF9B580112C2C72F958E437BA3C019CE3A233DF01BC028B19AB3CC3BA74AED19418FAD15F6FFAF2FF6C630D3B6A27C ss = 5F41497B81BC1B01750D99ACD47D7C3B count = 27 seed = 54770EA1252EA2857D6635151194F5F520ADEA8A41E409FF498D40C271359858FE2B084D5B96BEE087B8E8F4DD4E00C5 pk = 8040151EF6F2F1FACAD513E56755FB7836A4E36AD9B4998879CF56E2FA2B1C9DF9B4A77A36EB93921E68E7FB21C54746B8F68FA766D9B3FED202577EE9043DCBAD7E5C58623DB70CCF1B3B341026ABB5F675E3DAF0C6E1045A9D682DBB5318CE310796CB1D2B4666EB36C6484874D3DD592E8650503E927255DF91E98B0BBECC66DB58F4DAAC243B2334226D53F826F6988D7C3D38551927A784C8BD862BA074B8C940B356977958BF06B2B6CD27DC52C9006901E741533E6104210B1CE5D8878F8C58318BFEE9AD0970BA2DCB0C15178B4F015642042870090A3468022AE3EE3EBB054F30CA55FE9FCF0E00D1006D156C123843B6338462A5252F031D7D771B64701D1DDC6828EE2A0F94517F5A69B39E4184637D1E4E51DA87DD67B01F97C5E0FE58C0C06D47AA53816B74D013E163CE8A0919308AFC6646FB150137C46918B5C4D348D3A07C533817027AA0534654EF8AD68A0B5134D40D453DF25B20F6CEEF0A637A0FF7E11D59C638AE6EBD04B62E5D12C5D1D1FFCAB231 sk = CCB073C4B90BE0AD746E26FB093B60C70110BD1DCBCDDB5671600A8982C350DF524CDE514431DED7AEC23576530894BCBF0EC0BFEF0BB60F8040151EF6F2F1FACAD513E56755FB7836A4E36AD9B4998879CF56E2FA2B1C9DF9B4A77A36EB93921E68E7FB21C54746B8F68FA766D9B3FED202577EE9043DCBAD7E5C58623DB70CCF1B3B341026ABB5F675E3DAF0C6E1045A9D682DBB5318CE310796CB1D2B4666EB36C6484874D3DD592E8650503E927255DF91E98B0BBECC66DB58F4DAAC243B2334226D53F826F6988D7C3D38551927A784C8BD862BA074B8C940B356977958BF06B2B6CD27DC52C9006901E741533E6104210B1CE5D8878F8C58318BFEE9AD0970BA2DCB0C15178B4F015642042870090A3468022AE3EE3EBB054F30CA55FE9FCF0E00D1006D156C123843B6338462A5252F031D7D771B64701D1DDC6828EE2A0F94517F5A69B39E4184637D1E4E51DA87DD67B01F97C5E0FE58C0C06D47AA53816B74D013E163CE8A0919308AFC6646FB150137C46918B5C4D348D3A07C533817027AA0534654EF8AD68A0B5134D40D453DF25B20F6CEEF0A637A0FF7E11D59C638AE6EBD04B62E5D12C5D1D1FFCAB231 ct = 1F0FA0104C96144E7C28342311FEB27FAF006F7E065C297D40EA0366793B14EA89F0950684364BBB1807DB5CC343617ED2C294F955E89C7D3FAACC6335CE29EBCC10DC040A255C67A11C6DDB62216BDAB157CBB10591367F57DA8A2034B8FCDE021D96815407F76ECF46E636528B486C506BB41654914CFA6EE82E59722D2BF1DAC285BF3B8AF2C1BC8A49597C275A1B8BED243FDF55F35A323B5CFC71030F90879815700A231CFB298C5827852801772624CA42EE84F9B66933F28E2F3945320F777522A373C02BA874F3D37EBFFBC933BF07037B3FB6821A4E8262467112A9A3E51D5D872F1E96BFB4113A5C3282AA65B9C16ACAC8EA376B163824B3EAA169587D9B416BE0455353D3F32C992C199D362169C73472534BB16568A702E5CF3C320F53E1CFA867AD0332904B487FDC2CD8D054A45E2CF490E6C93EA1DE39D97662877268386D684F044D09A1EF6BE2F5EBFB6D66DC7EDCAE80542EC71F8CD85FF83E7EA87458EDD16CD6DB61BD3BBE604283538445D86B022A1A405A399CCD476A0AEB865FD29A37621C3851BE47E31E9AA9 ss = DFF7BA4FE3860FA139A2D748AAFFED87 count = 28 seed = CD6CFE94E9C0A1CC4FFDCD2D7876504BE5F50F1D1CA5CF93482943465B268276056F2781F4DE805C138976CA72621387 pk = A84E38AE1C3E876C77635707A79507625B8E65BD47B168BDFB6A2D0325DB44F125C791940CC97428BBF620FB79F175DC697A9FA1367FA36C9577CA5ABBCE0CEC0DB3F441869FE4426B5D6202B6D3F9D24921F8530ECDFE9A10DF5875A850528F142D62CB530ADF9BB2F9D05A61FAB58AC113B87835DF34E6BBF9B5EF0424E13A2FD86DB5DBE31EDB2A7D11F3CBB522409E718371C59DF5AC109792560F60A96DB5067820694A4CD1006E43CAC5434BE2291687B0E0B2675C31AE8ECB3645BA884297BF32237DC6888B7E090E7B9A82C2743489D019C1E736A8FFE3534DF4EF076B36E2E6E921CC0947203D6498BD8FF1B639CD8FF07F73985B73BA28B982F9ECAAB5441A201CCDA36D498BA840089B7B9B68FC7E819499A3DDA3A101A0BBDA6A6D3D4D6F791C9E417EEEC10CB5273A4E198540815A6E94542DD02C73908A73D48F346CAD48102DD7BD311F5DC56403A70910F9B04FFAC8D0210DCD96601B26A021CCA33DAE386276BCDC54C57FA39D54023B8757C14AEB4A7F11 sk = 2E889F44E28901E9AC7CA6B2FFFCB124C8979401B17064D70E145E44AAE52CFC609E6F47FD7A6F6AF877190FF52256D0AC5B05B89C3F440FA84E38AE1C3E876C77635707A79507625B8E65BD47B168BDFB6A2D0325DB44F125C791940CC97428BBF620FB79F175DC697A9FA1367FA36C9577CA5ABBCE0CEC0DB3F441869FE4426B5D6202B6D3F9D24921F8530ECDFE9A10DF5875A850528F142D62CB530ADF9BB2F9D05A61FAB58AC113B87835DF34E6BBF9B5EF0424E13A2FD86DB5DBE31EDB2A7D11F3CBB522409E718371C59DF5AC109792560F60A96DB5067820694A4CD1006E43CAC5434BE2291687B0E0B2675C31AE8ECB3645BA884297BF32237DC6888B7E090E7B9A82C2743489D019C1E736A8FFE3534DF4EF076B36E2E6E921CC0947203D6498BD8FF1B639CD8FF07F73985B73BA28B982F9ECAAB5441A201CCDA36D498BA840089B7B9B68FC7E819499A3DDA3A101A0BBDA6A6D3D4D6F791C9E417EEEC10CB5273A4E198540815A6E94542DD02C73908A73D48F346CAD48102DD7BD311F5DC56403A70910F9B04FFAC8D0210DCD96601B26A021CCA33DAE386276BCDC54C57FA39D54023B8757C14AEB4A7F11 ct = 89A76D1EC84283D0962457BFBC983700C07E3BEEB4EF3663240F7AED7CEC2F894F281C75FB13867C38315CD60CC2F9359A72657EB628FDEC18E9CBEEB6C70AE216F545F508298546E6833BF59025BBD178B1D0C4B0DFDA14C5D0386275DD1684D9D5960D827EDA45C4AA2130F42DB923B80E72A84E067DB26234F550D20313AE3F4A6BEDF5E739E06C3DB67C4FE786AF683D4A4C6580FCCF353A9B69AE42BC875F315CF783347301C63A17EBDE1F02971269D105E9B22E00C556E8BA12372397F9C457087C62EB6ACB46F287194ED3A1A3A150CE594E935E233E6D1BEAFA055D9F165E750CD9AA599D48020EB62B4AE88DF7277628F1D333F1EC0910C8390BBD8F7384AC67474ABBE19C80AD6170D80B767F01E099F988C1E905418BE1CABA9B342672DAE18F246246C6AD9F47EB192AB189BD5455BE1C2AA848279C3E4BE28963EA258FC83A473F44971CC7B16EF791A645F66AFD5AF42FA4F515431C79FD284CE75FF35D3AE77A2100C5D28A82F12E423A9EFAE6C76250C62D7A6869C82ED45A41170F21E7FAB4FE7E082BE872D897BE90 ss = CBCDAB4276831A699154C99595F1BD3A count = 29 seed = 265EB2DE7099E4BD5614E5DE7F0C2A05C78EF3E8E2DD4AE4CB70F3E5E59C8D1D88248303F07DE0C5508652DA66B47222 pk = 602FA1C3C69FEEC48E7FC1586A996317BC4C857301F0331CA908B7DA4FE4DBAE7E191E3450ADD014DD3D21213536432914B27D88E0B5B7C5A3D1A8CE59280327F2B8CC2A5A3F067A58A0213AD72657F3EC2F6F841ACDEB7F024B7E4E7EE885C0AB8489AC68CC497009A19C3B3A2E70DE295E211D004A36A8AD198310F13AB7641988D29714D3CEF1EEDDF02196AF445ED7443D45F58E843CEE8EC0E008C64158976FF2BAFAA6CE9F81D4547DA454DBFD41DEF879B5163CDFC650A2612F7B506DED6036D2F9CFB027FFF52D59A74E99F200DB32E125C990D4A3DAD97498AB197E36BD9B7F91954FC07034B196BD83FA41B2F34BDA4EC2B2184C62B725E1F95EE62C54F26E8CB8553E44CD094AEA7FC9036C6B7F47FE582E1CEF86D660233A9EE9A938A2BB56D0B057B4422C2360E84918B5415800D0FF6CF127232383CE42E46CE23522387517DCD20C3B67FCC7BD09AC8C94E9329F6D7B0B4ACCCE0A97636CB9A51EB259E9CE6B061CF606E04C06FA6D7A4B570660C4BF524D25 sk = 174AAA36410566DC15A5E62874218D7ABDDE0B2C0F30D87750A7A2354F7E5CEFA6F4A4E9A1C411EB9364506E9E1204A8ACB3CB77FBD2C40D602FA1C3C69FEEC48E7FC1586A996317BC4C857301F0331CA908B7DA4FE4DBAE7E191E3450ADD014DD3D21213536432914B27D88E0B5B7C5A3D1A8CE59280327F2B8CC2A5A3F067A58A0213AD72657F3EC2F6F841ACDEB7F024B7E4E7EE885C0AB8489AC68CC497009A19C3B3A2E70DE295E211D004A36A8AD198310F13AB7641988D29714D3CEF1EEDDF02196AF445ED7443D45F58E843CEE8EC0E008C64158976FF2BAFAA6CE9F81D4547DA454DBFD41DEF879B5163CDFC650A2612F7B506DED6036D2F9CFB027FFF52D59A74E99F200DB32E125C990D4A3DAD97498AB197E36BD9B7F91954FC07034B196BD83FA41B2F34BDA4EC2B2184C62B725E1F95EE62C54F26E8CB8553E44CD094AEA7FC9036C6B7F47FE582E1CEF86D660233A9EE9A938A2BB56D0B057B4422C2360E84918B5415800D0FF6CF127232383CE42E46CE23522387517DCD20C3B67FCC7BD09AC8C94E9329F6D7B0B4ACCCE0A97636CB9A51EB259E9CE6B061CF606E04C06FA6D7A4B570660C4BF524D25 ct = DFF7510B165CB9F29F5584E5DDDBC8C3CB956B474F3F8516E1121FCE930AE7A9641CAE16D79028556C6C68CBD256E325F6554AC9718BB84B21D2224DC7481DC9D010B5965CD5EE23A99E709959FBAE0ADC15BA1BEE2EAC6D8DB69A23CA88DDBBF40CD8F28050BA3EF85BFBEC68E1BD470FD99B56C838BF54FE8B0FD5062A46EFAE8DDC470F28F522A81D00690F96F16B7E6D332F6E3E0EC121D5F962BE727D96623427D27835CF7ACE9FF09F920CD4FD6FEEE3FBCA22570C7BA1E44C2692C16FF72A863B02041B89863EE94082F4E5BE780103FFEB01F31945B76EEDE4A93F9203A42CAF45B3FF0DBE8B510A0FD486694E7876A6563E41562C126A2D1B07FDB0D9631A4B176F6C8E43C281DFE47B699C80F3675894F418E041DE8F795BCC5638A1430AA8DA7E77790AE036C6A167EFDE863C81029311E2E1AED01D1FC3AB69CDFC3E41AC1462BFDF6F80F33BD0C2C1D7EE75157B492AFD539F188E93260127A97A5899BBF7332D7B51A454E7A441FF4229C9843E17EC81CC3D021A5BDC35EAD3C3B75D13EDC5348181D09615047AAB3E7A52 ss = 772CC9C84D47BCA08F41B27DD594178F count = 30 seed = 806BBD111F27C2668318387BD0830F65EC21A51AF01985EF48D03D64E1958FF7EE5133A4EBF6DBF36329BCAAF65F40EA pk = E84E74A51A664F28EEFD16F9EC713AEF6C23DA691B46B14352ED75096E47764276CD9F9801480CA3C6B8225C9CB876E6C617EFDB0C81AA67516347F368E80D339B639358BF0ED636A71B39D0089C3AA7A90B810745637BD27477816D56653A90CD8D1EEDC71712B109885524B7CA9D008764D9579C903A01B772A10CAE0E8FDFFA8A9734DF09CD084B3A2BE7402F7C13514BF0FE170B3C92B5E5523B83AF214900EACFDFD9076F315E5880E65967BF0BA131957249C6A4C0E618DD290DC3CC039D1C2E392BF5BB14D70CEE118B94E727DAE15BFD0C1CF688BD5143E58233C7981459FD230FAC0A444EA0E657345FE0F60799690DA4FE32671023173DBF0A4AA0DEA36A9FFFE0A2939EBE6EB4216EB6D0E2F5F10ED26F1097CDC1CF8C8106E57BD756ECEDF8DCA8A43584CDCA0DBE7B2A6C68D3341E5F458AD229290E94B5E942E263A9142B868F41CA841E11F05499E701D6C0ECCA5D60CB2DE0FB67A4B6544DC7BD403233D5A87ABFBED2BDAEDB2345399D76D41E89E2226C3F sk = 351FE4313E2DA7FAC83D509F3103CAF7B4C64A4D458FEFDFF072D9B5A99F9C7A0A011E4DC10F6B600D611F40BBA75071E7BEE61D23FD5E0AE84E74A51A664F28EEFD16F9EC713AEF6C23DA691B46B14352ED75096E47764276CD9F9801480CA3C6B8225C9CB876E6C617EFDB0C81AA67516347F368E80D339B639358BF0ED636A71B39D0089C3AA7A90B810745637BD27477816D56653A90CD8D1EEDC71712B109885524B7CA9D008764D9579C903A01B772A10CAE0E8FDFFA8A9734DF09CD084B3A2BE7402F7C13514BF0FE170B3C92B5E5523B83AF214900EACFDFD9076F315E5880E65967BF0BA131957249C6A4C0E618DD290DC3CC039D1C2E392BF5BB14D70CEE118B94E727DAE15BFD0C1CF688BD5143E58233C7981459FD230FAC0A444EA0E657345FE0F60799690DA4FE32671023173DBF0A4AA0DEA36A9FFFE0A2939EBE6EB4216EB6D0E2F5F10ED26F1097CDC1CF8C8106E57BD756ECEDF8DCA8A43584CDCA0DBE7B2A6C68D3341E5F458AD229290E94B5E942E263A9142B868F41CA841E11F05499E701D6C0ECCA5D60CB2DE0FB67A4B6544DC7BD403233D5A87ABFBED2BDAEDB2345399D76D41E89E2226C3F ct = 67C81D37A9D752BC533D20675BD31F9841944B908A203302E2D2064153E051347D54795294182BBBDFAEF34EC19FAA858C0739C0CCC010F7FFE790E5D67E0A79D26D5E23FFC0BB41F41EBAB2B42E869722D294A88F391D7BD95BC9FFB8F81AC0EFEA51022E497E32C9D96592BF9B8BADD0045552A93FA805874A4DC3472FCBDF3DD4414893BB48F75EDAF36E4010CF3BF1379650046B8635E2B9B1954E68EDEB04609DA133E30B118CD130B8FA70B905F08EEEBC86D8AC707AC0E8640E61999A76A9FB260A39BCEF26A4D9666F32339560EC3CDFDE187EFBBF538A15042DF03AF2434B4ACB2337FA859B4A148FD340D92408E7A17E9306E9B16C6434A46C3BB2AA4C086390B7421325B864F0D16CE21E138887179702FA207B65BFE42A803F67439B4259CE7AA97829A9D91C975EC0577536AA9EA4E4DF6B99B710BE57D56E1B538F7909940068DF42A47171E61669DDF1F0A3F346E963F897F3B29E76443E5A7225D919350009FB03CCD59E187533035A3E6999E6B46FA00B0A7CBAF81176849220EF4758AC61D2A3B6E0F3206A9895769C ss = B2685302535EA18B700997146C2A54B4 count = 31 seed = AD540A9CE816D6FB1661E5483C44F6FDD00C9E7BD1A8CEDA4B4C4D3697D4F78ED0A56954996CCB7DA96ECB8F5CB15809 pk = F11CF893CE4F794216B11A75B0B2981F8DB3FC8550A75C86DB2279FD4CB445E2F4D21F7380570832963F1445AB898267EC1B84196CAC1A84566D7C4D334505C5AB98D638B2E1A5766F5F716FDF1177AB864D2E2CE10BF8DC3D0A3CAFA05B587D746F5CC78E32F283C035886A96698BDCF0F2CAE0B5D4B9C725A3EB2EA13AA43AEC99488962F8B9A5038DD655C0237023CF21002E3E19B1A993C9118DDC74A07B4F9585C0BCEA6E401A384C4F411A5A6E97DA4E53DA6C8F39F62304F201EC93EDFA76FDA6CE557C4389D5ACE744ED5578A391B6AF01F00F93F4EC7CE41F5C5D1FB11D367C0F2CEB4DD9A92BD8948D777F4285EEBB0870C9C39BD0523804A9FDDFCDE61810D8B958E172702EB97D10A98E9FDDFBE1FC2146230AA26B7FFF48B70ECFDBEF9E7CBBCC12308992FDEF8CA0CD9F0A387F1B68D661A46C37D7FAB9A4ECDE63BEF0A3D7732CA7A8E18C88EBEDF546E842E27CC04FA78A8C03DF22A747E2D627FC9EB3FD8A57337BE759D1957C1D31FCA3FEE6D171192B0C sk = 9BC5315580207C6C16DCF3A30C48DAF278DE12E8C27DF6735A4D0A8A41C4F666854E9B13673071CEB2FD61DEF9A850C211E7C50071B1DD0DF11CF893CE4F794216B11A75B0B2981F8DB3FC8550A75C86DB2279FD4CB445E2F4D21F7380570832963F1445AB898267EC1B84196CAC1A84566D7C4D334505C5AB98D638B2E1A5766F5F716FDF1177AB864D2E2CE10BF8DC3D0A3CAFA05B587D746F5CC78E32F283C035886A96698BDCF0F2CAE0B5D4B9C725A3EB2EA13AA43AEC99488962F8B9A5038DD655C0237023CF21002E3E19B1A993C9118DDC74A07B4F9585C0BCEA6E401A384C4F411A5A6E97DA4E53DA6C8F39F62304F201EC93EDFA76FDA6CE557C4389D5ACE744ED5578A391B6AF01F00F93F4EC7CE41F5C5D1FB11D367C0F2CEB4DD9A92BD8948D777F4285EEBB0870C9C39BD0523804A9FDDFCDE61810D8B958E172702EB97D10A98E9FDDFBE1FC2146230AA26B7FFF48B70ECFDBEF9E7CBBCC12308992FDEF8CA0CD9F0A387F1B68D661A46C37D7FAB9A4ECDE63BEF0A3D7732CA7A8E18C88EBEDF546E842E27CC04FA78A8C03DF22A747E2D627FC9EB3FD8A57337BE759D1957C1D31FCA3FEE6D171192B0C ct = 1AD7BDD059DF883874EE21BCFA59493976E56B24EA8A747D586F462632E84AB3FD39DB97218916D927AFDBEA2DF448D940C664A3DAE6671AEB5030A65DBA39C75CB1D9173D0C1C9FCCDFC84DBD3A6519488F63E894572D134CD382DAF793B27B41253786BBB7B1E717F51335466382463DBB2C9CD6E53A1E4103C7671C0217C64A667A7D24DA0E1616A1AF9822171076717A2AE2A52E50D9A1499799885A8926F96410943D53E006107FD2749D34CEAA6CB5DEAAE678CBD527DA66DF215936E1AC8DB2A6177B4E17D7947693368B287AF67EF374B145D484EDF3890CC2B2AE378257BE4651859F9757BB809AAB434D045CC92E219E73A19679B50415153C704FF16FD53C5FB0E13361D444B64B41AD05977762CD174A3BC87A888844F223A799B360DBA68886A2E532DF2E893C8966FE1E2081145A3986A0114324B1F9A5677C5865D721CFF33EEB65112CA880F47E3F483AA76F078A22D1BBDFE80A0D3E672F5322A8EB72E23028B94997F911F6C0AE21A837A46C597FE0D53201E426F9C4B9B37F9B583ED394C5A9DF4C2A8A50C6166CCE ss = F7D9BF21FF4E2112EE4AD1C0811B2B32 count = 32 seed = 288A5F2684D862A86D2790AFDDDDBAC6FDA934EE7D2E6DA1508BB550838609E8107312B28E00A6C01706374CCD3AEFA7 pk = 09C8B819C7866E21006B8DE22C28AEA4AC787B9EC69E0C25848B34243593AF30340DF2A8868EA66E31B91E041B18C62CAA6322B18EB19B9FFBB17B5FC9BE1B4D279DCD851E0BA8695D0869254975D0DAE7952E4D92F991A287683694EDDF6E25D08C338255D8FC8A4D91173D73CF56CE890C9925520B38C0DB6F0DED2437324A568482E9BA4B7CF4693CCCADE63869163854E8A081C063F86EDFB342DB825671CBD4641BB8B2CD88971AD57393F618E2EA8FE7D79C764FA151755C6712B9EE564A98B294E3A41ABC33C06D90F7928AB797E3A173E1AEDEFF704EF6B64BDED85F925D4428E9BA58C3222D9512B7DD2E5F4C4A5BF77CB68BEF10CB992C0D1309E734B5160B67F260F8119404F1A85B22E79BD202CF9952AA0CAB0C21C12F1B6EBE0C6A1867291F9EC2503C51C0AFA08C978A24E07E32411F76C9470843C04E4B542B463198911E20369A5F5B849FF977ABF028BD8AD61326BE23F5679A0207D73B3DD6B13DCEA58F67D9A7159BDBF708955D0DDBA272EB9B476405 sk = D8B907B34D152FF8603B73051F772DAA71EB902C47B7E2F036B817736CBC5F7B1DD6EEF5FE6332FB1A598F3871E5470D440FD2EA631DA20A09C8B819C7866E21006B8DE22C28AEA4AC787B9EC69E0C25848B34243593AF30340DF2A8868EA66E31B91E041B18C62CAA6322B18EB19B9FFBB17B5FC9BE1B4D279DCD851E0BA8695D0869254975D0DAE7952E4D92F991A287683694EDDF6E25D08C338255D8FC8A4D91173D73CF56CE890C9925520B38C0DB6F0DED2437324A568482E9BA4B7CF4693CCCADE63869163854E8A081C063F86EDFB342DB825671CBD4641BB8B2CD88971AD57393F618E2EA8FE7D79C764FA151755C6712B9EE564A98B294E3A41ABC33C06D90F7928AB797E3A173E1AEDEFF704EF6B64BDED85F925D4428E9BA58C3222D9512B7DD2E5F4C4A5BF77CB68BEF10CB992C0D1309E734B5160B67F260F8119404F1A85B22E79BD202CF9952AA0CAB0C21C12F1B6EBE0C6A1867291F9EC2503C51C0AFA08C978A24E07E32411F76C9470843C04E4B542B463198911E20369A5F5B849FF977ABF028BD8AD61326BE23F5679A0207D73B3DD6B13DCEA58F67D9A7159BDBF708955D0DDBA272EB9B476405 ct = 5EB0EF6306ED2DA3349B96D8DF6C877DF9251EF0742858F836C183E2BBC104945915058FDCB10D705B9E6E4525AA782B08F6DB143F1B063E6ED4770E22AF17D41B326A0099CAFA6E532B2749871C955AF3DBA379F1CAA22CD8547F32F284548CE167B71437FB570881EA43DD260C5663CEE7306B6E0DE07B9528C1ADF70E7D810031BA9D2318A8DE489E2A8DE8EFC2A48FED222CE2EE81A1299475BBE2BA89EA01093EE7899A9AA22F10C418A57F3E07C1F7E8BDB6CDD95AB81668A73DF595CC9C9B94C09C836C77CE2EDB27F26D5499567A44B056ECEB5DEC817758FB38456EBFFB92114452030D95CEE601CA5AF0FB8F49C978100FE421E435AE0683542C4618A19932B6B25B64668017411A296D3E0CF13B3176C50415E5E9EB474BE94ECB104E6D5E2AFC78A21B8AB82C586A7DBBB81CE389F8D9BD8A6ABE3EF005B2B3ACD5853259606ABE4675E4A24FD71DF08410B38492EF65300203D87CB25EF21944946DCBD9C122E95B385AEF1B7005C066CFDB604E21372EA8D90096BE597E14A39450D87E1B6E7246D5C78FEC6D97C37CFB7B ss = 84B8602DD674AA0BE4597F8A6416FEE1 count = 33 seed = 4635DC5BB92EF98CDB6220DF0DD717C7F8158375EAA2B78FC3F0B58E9C9653E92684CAD3461D9158A481DA3D14694C44 pk = DF1ECEAAC4E613ACAB5B4E81D5C877DFE08B2313FB3196E6AB3ACBB8C4283360646AD45391FF36162D46F75235ABA8E766332956420B21C3EC5A14D01F003C1F267C6386AE7363642A4D33C38D886AD637FCB716E67B5C94392B4D6B19DBDB147CE0B62C41C092D6414E7E318B80E29BB321BE4959C0577850E1FB33BA251D5D4AEE9C1918B8123E70DAD5BFCC94F72322DAD2315111B3C654C5A98C37A3DB1E846EF06289D82109B8C8F59669A5EC82D1D25A29A5F503ED5DE2C8FF227A8A0AC553CCC3AEB95F2BBBC794D8B0BD947E785AC5E3EE4D9362613C90CD687D1124B3BFEC0725A55D7DA9454F91DF9CE2352BAB349EF96846BADE23D90DDB62DAA3CB5DB6457AEDADF67E496888AF65BB57F9CAAA4D051E8D80B626A38B1E570A77BC0CF052A8DB6F2EB77A83D59AB4162552D903B5E99AEDAA35A5389750AF399B7BB5492F60C3DED13E5659166E29FAA219AB48C487F8B409C7DD8EF1D33FD4338307E44F1207B250ECAB66C2430314FF4D128C1B7DCDE003A824 sk = 684A29E4E5480A5F2533E1526B5FAC8CDF5927F3D85087C775D12195EC32A8686D0600E45D4A7F54219B0D7A3826D193A51B9156ECF2ED06DF1ECEAAC4E613ACAB5B4E81D5C877DFE08B2313FB3196E6AB3ACBB8C4283360646AD45391FF36162D46F75235ABA8E766332956420B21C3EC5A14D01F003C1F267C6386AE7363642A4D33C38D886AD637FCB716E67B5C94392B4D6B19DBDB147CE0B62C41C092D6414E7E318B80E29BB321BE4959C0577850E1FB33BA251D5D4AEE9C1918B8123E70DAD5BFCC94F72322DAD2315111B3C654C5A98C37A3DB1E846EF06289D82109B8C8F59669A5EC82D1D25A29A5F503ED5DE2C8FF227A8A0AC553CCC3AEB95F2BBBC794D8B0BD947E785AC5E3EE4D9362613C90CD687D1124B3BFEC0725A55D7DA9454F91DF9CE2352BAB349EF96846BADE23D90DDB62DAA3CB5DB6457AEDADF67E496888AF65BB57F9CAAA4D051E8D80B626A38B1E570A77BC0CF052A8DB6F2EB77A83D59AB4162552D903B5E99AEDAA35A5389750AF399B7BB5492F60C3DED13E5659166E29FAA219AB48C487F8B409C7DD8EF1D33FD4338307E44F1207B250ECAB66C2430314FF4D128C1B7DCDE003A824 ct = 2FBB4B7D16A035D71A43587489EEF8EA6CEA196FADA08189419E9D50B20AAE6D54A67957C6FCF426CE8B47A16BBB423A82E8D009C58D6614B497F2C6D2B12ADB6A8F68A146C859CF72C05B97BC093479B557B064570E93359D4DE97A6893055A02F368F326765169DC55C1773182C22F14B4ECC549BB867F0BD598A6AF095E14103E48B815A5833E52D2F50C5F257B01B702197470945B52C30666D5738F5BF83C55CBD02984190724A315D4A95160E111B586FEA19B94DF37B8ADA41FF5D848D2779108EA429BDEF9669C80BBE25633114659F096EE9ECE8F377191815F4322BDDEEEAA143D1294D6EB90ADE4DC75AD81326ECFFFE65A91FF955D3778BF635060F88D9F880871AE9E5D464D76B9FEAC1C1DFF4442216C30B03B871DCEC39B2CFB1BF0862287B7E9C4C30B704BA628EA93B5C6558D8FA869B4603A567F996DF351F2D0535C4601730D056D357B49E9139408EEA2F0E1A5794812E5A2D303511B65DA8F8CD1019128D7F22A05F8143144F4F7E184E7280D1EA815B2226E4BB153A5FC6AF18539F7797CACB4F80E3334E452E2 ss = BABEDBAC90695F480D6DE1302F6C7676 count = 34 seed = 5DA2C51B4ACF488C8BDED5E985CC4702E4A7BCB248B5AC18AABA529F7F9CBF30EFA776E99F76D5C1686E94F50FB57DAE pk = A2F678AF9D971B311647B0678E2CF00415BD9DC09B4A2C930527F271BFB61B56409471B321C8C2F43D9CB54A3A2103A3EC40CC41DB68CA8DF9191A5B9253397901CD540FB69B91FD5D7660B55CCF3463F78F521CBEC327892118A95D3DC9826A26632016858609360821B03CA33912209316F8AAF2FFEE278E65541861236A165335CD20052D1CAEB26DBAB8CE5F7F80E9127A6FC70EB0C3178E8A7DA09EF66697420E16A0CA08FA41958B6F8DBC220640A88AAC9B3FF381251300F821C3359FD37B04095BC5B801EE0354F49DDFED8DB4FD4A4EA41C91402177C6FB23DBA45FD96B6C12908987EA21E023B67222CA4E5D5299C3A5468BCB2AAD53109637E0B1AFC522F5EB9CC6C2B64DA86F4493621FCD46A91D6A76134876B6C31A105252E3414F417D1D9ABF4711A3788B6677BFF3D2676C047C1E4B059A6513C7ED198B1056EE3AB0B6157110F32EA080EAF3A5EE21B110AA47E4C45546DBB024FCEA6B1E32ED1A108CBC2F6EB8B86FFDC5AE005010D0AEF5DB15EF7F913B sk = D76B3573F596EB286AB5231FEEC7499686B13021BE36CB12248C0A21EA0BB6D6F56F12300E8584D8E9A34E0E6F52227281151AE4C305FB0FA2F678AF9D971B311647B0678E2CF00415BD9DC09B4A2C930527F271BFB61B56409471B321C8C2F43D9CB54A3A2103A3EC40CC41DB68CA8DF9191A5B9253397901CD540FB69B91FD5D7660B55CCF3463F78F521CBEC327892118A95D3DC9826A26632016858609360821B03CA33912209316F8AAF2FFEE278E65541861236A165335CD20052D1CAEB26DBAB8CE5F7F80E9127A6FC70EB0C3178E8A7DA09EF66697420E16A0CA08FA41958B6F8DBC220640A88AAC9B3FF381251300F821C3359FD37B04095BC5B801EE0354F49DDFED8DB4FD4A4EA41C91402177C6FB23DBA45FD96B6C12908987EA21E023B67222CA4E5D5299C3A5468BCB2AAD53109637E0B1AFC522F5EB9CC6C2B64DA86F4493621FCD46A91D6A76134876B6C31A105252E3414F417D1D9ABF4711A3788B6677BFF3D2676C047C1E4B059A6513C7ED198B1056EE3AB0B6157110F32EA080EAF3A5EE21B110AA47E4C45546DBB024FCEA6B1E32ED1A108CBC2F6EB8B86FFDC5AE005010D0AEF5DB15EF7F913B ct = 0DC5DDFB19767AD39E22610522B06F9E58A8396C04874C63D3762FF50D03FA39FC67104C4CE1D53C7489FF5B2CDF423056FAF2302BC66A61C0334699EB841B9B036CC9CE8A08CB4F7F6AA05877A5598034B98B8E70DF0BC017DB9703974B610C1ACE37D298DFF3B5F88C95153D613764A77470EBE3508C488B60E6842C409ABA7F4DB54046240B96C36016B99989A8F99E3EF735944CB0B8FCA02045F8C2EDBE1F508673DA3C6721A3FD026AF61C61632A042229C15C154FF5E3AB44140D546369AEF0AFDC6A3FB6987619C4707EADE09BCD6BBA53CD32211DE634E59F06C15F52CD6CDA47479A1E339E58073B167FA8B68C24D7FA80CAB4800BBB17010F11BF0D628AEDA072985CFC1013A684A17020B504773D4F34D2B60B798DD976BC0D8C38802F7D1674E26FD501A4FBCCD3E5B06B2C955CC4921747E50A1A8AC73CC1BA2D09244D08E92FD9AA39173F3567FC4B9534E7C20652577C2125407D45CDBCAF4E22F3264F37F3DA89083C41D2581950245AFAFD8A42DF7F173603393CAD5BF9AB9CC54B381A1C1BAE6E0F680020C5E6C354 ss = E4035CEA25E010DD836BD1A03884A8CE count = 35 seed = 4D2239E84B052109A78DBAB6D80C51A86D38248105970476B74A0B78B9CFAB6283E30D5A406FAE1C7F54F8BAE1110EE4 pk = 86B70341C41E5F675BA450F65CE5A97F0949118F4EE2457303AB7602628EB8D65300F2D856BEC847ACA11551B9C8BB976DC3CC1EC4A5699F048180B2E1BD04447D73D7AC3ABE465A0ACDB6666112902A4A12154327DF54C00CB51DA47F9B1A8EC20F65EC6D1D0B72EA73BD6A991CC327BF9E8EA89161490350416F47FA13E6A5102AC9EBB2191ED34787DC9B480DF868E41731718B940DACCB416A3C48EA9C916FE1179D41B93A1B9866578144D0EF94605899AE95EAF374357FF2EF067F954C91E1451F8B5FCD5774A95EB04B56DF421642D6D95805FE1835AA37C4C68EEAF5A83603BFBB8689DED080A506AC7D4AA49772055997060B648BEA002AEEE6D15A0E927ABF0A15444DC782977DC66A7EE49952157E256B713D6B03FF19CEEC6D17813CEEBB0D6BAD2956DAD630C8111FD5A53677B734713BCEA4C90F21CC365D986C6A784F169436131EEDE061E47BC7C314614C7362097A1B32EF8CC8F104374FD750C882C9CE6DA902CBDC8848B9A6583C72AE05BF4C6B503A17 sk = B87439FDE81C9E39EEBE7CF741C685785532C1DD23E8EF861646460817A0FCE5836BDFE124A7448E7ADF7B8ECC2652AC6D280E986682DF0186B70341C41E5F675BA450F65CE5A97F0949118F4EE2457303AB7602628EB8D65300F2D856BEC847ACA11551B9C8BB976DC3CC1EC4A5699F048180B2E1BD04447D73D7AC3ABE465A0ACDB6666112902A4A12154327DF54C00CB51DA47F9B1A8EC20F65EC6D1D0B72EA73BD6A991CC327BF9E8EA89161490350416F47FA13E6A5102AC9EBB2191ED34787DC9B480DF868E41731718B940DACCB416A3C48EA9C916FE1179D41B93A1B9866578144D0EF94605899AE95EAF374357FF2EF067F954C91E1451F8B5FCD5774A95EB04B56DF421642D6D95805FE1835AA37C4C68EEAF5A83603BFBB8689DED080A506AC7D4AA49772055997060B648BEA002AEEE6D15A0E927ABF0A15444DC782977DC66A7EE49952157E256B713D6B03FF19CEEC6D17813CEEBB0D6BAD2956DAD630C8111FD5A53677B734713BCEA4C90F21CC365D986C6A784F169436131EEDE061E47BC7C314614C7362097A1B32EF8CC8F104374FD750C882C9CE6DA902CBDC8848B9A6583C72AE05BF4C6B503A17 ct = D98D8C436743CFE96B7EC82B65ED195736FAA459852941462AD95F1FCBE59FA0A64C16720356515671F71EF4F82C0B96CF2BF0F08E2D1207AE0EB5AFB06C3928B40348BF90460AEEE989DE10F9B2886BBCB8B9CA27B6FBCC49C56B51D8404506387B65F62C555B1A1419231C9AC154398526E756C2364265C374AF7EB1393A513E7DFAE327C08E70741AED32A7093702F1FC09010E2793BB66108D4D78FD78D45EECD23234AC46D7830AC0D9CC7C4BE2387C01FCDC96A10A2E9D20573F0EA50CCD9276297C211AD1C555657E6FFC426E17B5F794C5FBF04E8F68FC6F0DC25003FE74ACECB35959F2D10FA4E4DBC64D138447EC540BAB38030DA79D271FCAAD8D3250C0FB089756E38B8D601CDBB067D297542347A897C1BDBAE726E0B11F82F17E949FA48A09A25DA9E7E8E4F11A9F9E95E5AE58C14574423FA01551FA0496D3B496EA6EC4D444CE2B4B175D46D984F2A8ACAC707DEF1D899D8655C3CDD60F50A2EF3BA77FEC628C030E07079DB8A85BC35883DD546DECEDFB0966D2A49DAD34616F46B0A61C7CE188419F55A7C6ABFBC56B ss = 379C0F6C434A38A8BFFFA5A697B094DF count = 36 seed = EE762F5C9021C36446706A88EF16312F4A12C725CD7AFFF1484337C91EDA8E89F7007F3705747D29907B3FB7500E5074 pk = 0A204C8B526005B658629F2D6AAC7199AC1684438E8E5EF708B6B1C3A4F03E416B7EBEDE200D47CBDC37A0E46390497FEE8AF9F5467F13F18F5B216EB2743D2E7BAC595915E887F6423FF72D3FDC2588ACF6A42286E3EE98A8141F3C3C59B4862FB2E6FA5677E6C51E44DD78B28A23EAFDF05FC51AFE96AA93319D9AE60F6DC0F980040B841201244FB44342E66F1502495A9FE988A6FE5455CA121B286318460A7B358D0A40AEF423F105EF80DC7DC3D990CAA014FCE667DC8471692139FC8B8DB0F2BE7BA8DEB5EC070DE33D3905DB4DE175F96128FCB87C51AF94E1D841BA0560A0B28B1C2CF545CF23745EBBFCDFC155553C380C1637CBC3A61FD538A8FD2763F6AA63E5B4E5EB174D831676C5F41EFDA99DEFBB57AB78CC526ED727786E51867518472B80651C2084D374AF3EEB472C45AE2A4675856EF637ED6185E1B055883597E40A3934A76ACB5086EF62429F141B14B6BF94773F1782A020A0EDFA54CA3962306DD49F34DB83E2F9D597A65B1BED72D7691D973914 sk = 056661B38038DA4FDD7426F32A81576C73ED84843B30516879238A80DCFD7C992D84B2DFFA67493E669243D4FA38C46B090BDF86BC5484010A204C8B526005B658629F2D6AAC7199AC1684438E8E5EF708B6B1C3A4F03E416B7EBEDE200D47CBDC37A0E46390497FEE8AF9F5467F13F18F5B216EB2743D2E7BAC595915E887F6423FF72D3FDC2588ACF6A42286E3EE98A8141F3C3C59B4862FB2E6FA5677E6C51E44DD78B28A23EAFDF05FC51AFE96AA93319D9AE60F6DC0F980040B841201244FB44342E66F1502495A9FE988A6FE5455CA121B286318460A7B358D0A40AEF423F105EF80DC7DC3D990CAA014FCE667DC8471692139FC8B8DB0F2BE7BA8DEB5EC070DE33D3905DB4DE175F96128FCB87C51AF94E1D841BA0560A0B28B1C2CF545CF23745EBBFCDFC155553C380C1637CBC3A61FD538A8FD2763F6AA63E5B4E5EB174D831676C5F41EFDA99DEFBB57AB78CC526ED727786E51867518472B80651C2084D374AF3EEB472C45AE2A4675856EF637ED6185E1B055883597E40A3934A76ACB5086EF62429F141B14B6BF94773F1782A020A0EDFA54CA3962306DD49F34DB83E2F9D597A65B1BED72D7691D973914 ct = 2639AC4A3EBB4329945875FC63362EE634804F8302BC5701888CD651C981CA1BB25289B82749EA27D4274F001E9F9BE75CBEF7A738843FAD2DA0FD6F7F5131EEBFF73F9B0101067C2F8F7EEB6FC26441CE4EBA80DFC73A2CB91E1B832B89608064B3B967CA1CAF6512EBCFB046BE702A485880D7EDF3AFA67E15BAEE6B087A91737C7B4C64B59A9A82D20AB75685E4804214BC64B6BC4A21BE3243116E84E00D1D087CCA625C00296D0B0696C50E2F0DAEFA3012FD0FD5DC0F18D93832E2CED15AC4DC2538FD20308027379CB07DC2C89C042FA88B1B6601BD883C3DB2DF4BC2D2A07025DC399762B65F4004B35AF5F24A3230CF137DC8FF47252C0EB90A045B57D480E672BFC4F4A406329EF0D36D6CAB59A026B68082D947439A66966A25A2DC4BE2B14EC26A903A993D9DFE9B48102848FC7F4D4F51826C982D990F9823299D779D2C223377B146CA36C47581F2BBCF2007CB2654A7DF17D57E9419397A34C7AC78AAB68B2F3290F412A227ADA19FA83FFB757D76B1868E0A7E0A9985F22575C17126FBD6A91DD584540735AF5109A72E ss = 115A32B447D3D37F67C59F64B392A3E4 count = 37 seed = D882BA69AC8BBC88715F1C6387531F53273A5DAB87E66FAA8221A7F628D2BDEEE1CBC59C0E08D0ADD84520A3A70C1389 pk = ECD3EF5E7652EB979AA17837DDE8D99BB20D2D3A518FE1F4DC4E7667F70E74588F12AD42CF4A8F9A780D616F056D7CB4ADDC728044F25557E93D58A6E099053FD830E142ACEFA7D8F0E3F1F943C150080D853904F6CD179A2FF729338518C0C548E21D92181AA7121AF5EC481C65420ED68319DA707E8621C1ABEACDF23C9E42787721D70DC864EDBE9A621C396CD60DD3AA452B2F5E97A4C1F219B8480F324C9E0AC388E2F64F21E5E90175A1D646549C510DE4EC1E4AA1FC38E14037E53149FB8742ACDD690B96105421FB37C3ECBE7363FE5D1FA735A57E956F053D95C9B486E4D7CC3806535D5F0249CF994A990FCE5D8AB28890C8475F438E34A5CE16D35AE2AC2EC22628C291DC1BFDE42AF872F110419698EEAB5AF766DC8B5EDA9CBE6801948401B9E41ACC3A123DCEDBFEAB24AEBF7574CC49BE0B8A2570E9AE49BAEDC27941490E490755646A1D29F5447C027A30E1BB87D9B806B8CFB3F5336933B353540AF1002419F21EBD4AA06DE1ED23AC8FF7A3397705DA25 sk = A1B52D871612A1C611AE0944F9E71858F35D3BD14F20E96A1F135CF64B6403E103AFAE34DA038613E2853BBFC36BAAFA3C6A95347193F30CECD3EF5E7652EB979AA17837DDE8D99BB20D2D3A518FE1F4DC4E7667F70E74588F12AD42CF4A8F9A780D616F056D7CB4ADDC728044F25557E93D58A6E099053FD830E142ACEFA7D8F0E3F1F943C150080D853904F6CD179A2FF729338518C0C548E21D92181AA7121AF5EC481C65420ED68319DA707E8621C1ABEACDF23C9E42787721D70DC864EDBE9A621C396CD60DD3AA452B2F5E97A4C1F219B8480F324C9E0AC388E2F64F21E5E90175A1D646549C510DE4EC1E4AA1FC38E14037E53149FB8742ACDD690B96105421FB37C3ECBE7363FE5D1FA735A57E956F053D95C9B486E4D7CC3806535D5F0249CF994A990FCE5D8AB28890C8475F438E34A5CE16D35AE2AC2EC22628C291DC1BFDE42AF872F110419698EEAB5AF766DC8B5EDA9CBE6801948401B9E41ACC3A123DCEDBFEAB24AEBF7574CC49BE0B8A2570E9AE49BAEDC27941490E490755646A1D29F5447C027A30E1BB87D9B806B8CFB3F5336933B353540AF1002419F21EBD4AA06DE1ED23AC8FF7A3397705DA25 ct = 3A511FB52D891DD53225730289CC02A83FE0DCFC3694D99EB5BE9BF4AF001EE16EE33C1484BA45F7684F1F1534B218BAF49CCEC7F91B6DC66690E85BD1E105AD00BD69C316514ACBDE6C1D43156490E6680E0F9FFD4223F5A8C9E52BFFB05809E0CF2C94647CC8E131C87D95DDDAFE370372AC54536B9D32AA6A6D12F23CF6A143A376721D161E47DF3C724494D3720D73FCF50742816256E883574B8190272C0F45E9352E710C3E033CD0126A5E36C00402358673D7E4501F4CC69606D4FB47A9E3B0057C29B7D0F02A011518624EAAF1C00BE8EA290EE07CA2BC8CDFCE1842271AC918F4802E6FD4FC0E4F9FF0A7B86396CB270B969C5A9254D1217C9EB333C367EF7847A769812BD56D872E5F42EFA03E7EEEC1ACA41B8E05E6726DE973ACAE2B62E2CC17102BE43C6402219BE62E6E4B3191F65E63B303562CA37D9658E848623AE75B1FCE52A9974C68104377219E215CC9F2C584A172ADA04EC3A980817D413666E1094323E30336C6DFF47981D7C21DBE4551A0EEDF09F1168237CCE699D452E72AAF4A8B4767E6DE3652CFAD55C5 ss = 67441C630FEA500715135D01B2BF333C count = 38 seed = 6C3AFF39F5D097096D882F24717718C8A702382DC4AAFFD7629763FDA73C163CF084807BBB0C9F600CD31A7135F48AEC pk = 7B6618B5F4274DC7131D47D0801BE79037FE281FF709F80C333065D823FAA35F9288496092B789DA38D04780047D8497EEF0A2CEF6A167225FB1A5FFE5F21A4469007EFCC4F94878198DF179F51E853011FCC448B825B97886853AFBC2592B657C0A44B09E52878AF9CF3DE85939445BE8AEE2C879166470B7D54A7FE80F576D2E19B42EC49507CBBE904D2F9694682243D4B206B621886280FFFD7B42FB2E58805B0611F0BA850FFBD4AF6D12D2320A0254A7A43419F2470B783D9A1FF5715429B0967C64AB12CBA17CCC2B65DEC16FEA58DF742A6DD2C8C973E7FA6456E26C474398E57C3A9BA5FEE996AAE36FB61A0CADF6E374F85794AD983625DCB792DFEDF4AF73613C666101E74CB0274C6BD2236B658F81CF7F811A608A6C015277B83B8F48D0FC5B40BF71E2BB030BEEA82092908B48C9DFE691AFA52AD4EB3520C87FE122617F0659523D5AC29D2B0FA153DB309D784F684DAF3B44BC79FDF0CF86B2FDB39884D7F47B27993BD6D62397226734862E5AE0CB5EE60E sk = 952B49C803D6D6FBA69F4375ADCE8594847A00BCAE2179DA62D7033947AE42CA53522A65FBAFE18D3BC3E0CB66164E9A094FE4B44D89770D7B6618B5F4274DC7131D47D0801BE79037FE281FF709F80C333065D823FAA35F9288496092B789DA38D04780047D8497EEF0A2CEF6A167225FB1A5FFE5F21A4469007EFCC4F94878198DF179F51E853011FCC448B825B97886853AFBC2592B657C0A44B09E52878AF9CF3DE85939445BE8AEE2C879166470B7D54A7FE80F576D2E19B42EC49507CBBE904D2F9694682243D4B206B621886280FFFD7B42FB2E58805B0611F0BA850FFBD4AF6D12D2320A0254A7A43419F2470B783D9A1FF5715429B0967C64AB12CBA17CCC2B65DEC16FEA58DF742A6DD2C8C973E7FA6456E26C474398E57C3A9BA5FEE996AAE36FB61A0CADF6E374F85794AD983625DCB792DFEDF4AF73613C666101E74CB0274C6BD2236B658F81CF7F811A608A6C015277B83B8F48D0FC5B40BF71E2BB030BEEA82092908B48C9DFE691AFA52AD4EB3520C87FE122617F0659523D5AC29D2B0FA153DB309D784F684DAF3B44BC79FDF0CF86B2FDB39884D7F47B27993BD6D62397226734862E5AE0CB5EE60E ct = C68EA5BA757FCB635FDAD5ABAE154EAF14BD465853E06EB4E4AC8633A0D47792BEBFC63E79F95F13B36F05DA6B4AF50F69A29847B7C9B72AE43FAFEFED110A013AE93D0A74ACE2C656A21822B98C280F77C4D8BB94BE93FC1AB1C76FA9B1C98981ADDA46DAFAF022C718F1DFD6A43E73D1F44538B36BEB649737EECC742A7BE07936A853A5B0CDA890B48F2843D2B83EE7190EF25A5EBAC853FC49F889CC2006DD9E052D21B037EAD45A14D258AD12E42A68C0E551FC5BAEDFBA75C125E025925606E7F1BF215BEB93F0CA49631DB836F87686A3EDABD942E28E33099C8A56C02963C34022202D36D650B48A12CDAF9890662927093EFE02B675D52E81B39D014717BC84BF33805EC736EE08165DBF3A56EF4BE6DB2E5350D0CF186E66B3149177DC72E038CBD877290C2AC99322DF5E3F4549300B30C448EFAE3A4C51FA15AE6103F2DB0DB2F3A280F45C74A26D9E8B1E7D718F0828DDF16690E4FE6B301D0369A4354F9E44EFED5E38ADD7537A55425B5BB397659C2EB6622F63E5C2849CDB46B866D9F16E429B056BE0E11DDA4BF2F417 ss = 26DF53ACC8BBB7F3BDD4525113B593CD count = 39 seed = CF520B92A2E3677AFD003EC1EC6EF136A709D78F828C9C0DD4946EFBD451C5FAABFC83CA66F9D3D17EE4220553B7A69F pk = 5A4955E4D5DFB7AB332EDF7CE441D3702028E6631E409E7D07EF6D637868E34D673C1314A1269FE3FDD3B466E4F4B1A6241E6BB2164913FD91689607DB412112BC76160338A8B591B12D108958C58C587796CAF9FBA42E1C1F46F4F42D8D8BD68F50912F20AF93D7AAC287685FC6EA702A87B16984E4D7F12E1BE4D0063B1757DCD40A72210921291793986DB6E9C80B66E3EB479428EC13BE1107BC0878480C04DA25912EDB1B5016B0622DBCC9A5D2F8B18028174B9434B8951F7816E57E2C5723AC2245706D72DCCB51800C003CE58028202E4D8E9526316004F3EC441BFB49CEFF4EB26669F2FD9C588C325074AAC43C353E1588DF7FDF63421689EF4FBFF24D7A13C9D8FEC83D73774B4BA92BC9735CAE067AC6D444F995A9EE66EC555200D0786BBAF0249BB474D403870FCBF4BDF4F8C9A2B8772C65E402255AC3DB9B7E1BB064766B51AA1913FEEBD33D862B744390397D49AA3FF5977360A78C78344EC26E42EA4E55687B4D5D812F91A19F83B6331B9906A505191A sk = 3C815E57E9233E975FA1630208AAB206B71AE0DB37A7A87801C8E376FDB140EE343106C093AF7CB149B316BA79446CEB4E5E0CEDB9B164095A4955E4D5DFB7AB332EDF7CE441D3702028E6631E409E7D07EF6D637868E34D673C1314A1269FE3FDD3B466E4F4B1A6241E6BB2164913FD91689607DB412112BC76160338A8B591B12D108958C58C587796CAF9FBA42E1C1F46F4F42D8D8BD68F50912F20AF93D7AAC287685FC6EA702A87B16984E4D7F12E1BE4D0063B1757DCD40A72210921291793986DB6E9C80B66E3EB479428EC13BE1107BC0878480C04DA25912EDB1B5016B0622DBCC9A5D2F8B18028174B9434B8951F7816E57E2C5723AC2245706D72DCCB51800C003CE58028202E4D8E9526316004F3EC441BFB49CEFF4EB26669F2FD9C588C325074AAC43C353E1588DF7FDF63421689EF4FBFF24D7A13C9D8FEC83D73774B4BA92BC9735CAE067AC6D444F995A9EE66EC555200D0786BBAF0249BB474D403870FCBF4BDF4F8C9A2B8772C65E402255AC3DB9B7E1BB064766B51AA1913FEEBD33D862B744390397D49AA3FF5977360A78C78344EC26E42EA4E55687B4D5D812F91A19F83B6331B9906A505191A ct = CBC61B51AAD8CF07CB60E10BF51DC95B212F256BDA1BD1967F0C3A588F54E58A76FED6AD133D903268F503CFECEF9D408B93AE4FFAE698AEBCE5F104399A3633934105937B40BA859D55E918B9CC00EEDBF2F5F3A0A36E1483931021FFBF8BD62F6AEFF492D207C516EA6C9636C34C424B4D6E659EB30B4EB3C204862510956BC59059E58D90FA65260C393FCB0AE9F4A47CA2576FAA7787E407FF9044EADC94D5F9D729056109D5E0F9D1CCDB05F423A85727657281D1914DDA51A21A1434C7A8CD734C67B58A2210B27BF4A064F44C8E8BC2B13C02E805202A477133352916771A19FC25FA2DDB8C6F45E1D6611E25CE7E4D730D277285CCD26C15690465ABF167F2E3367E0CBE38EBA4E26A8DC299B97F61ADD67E524437D990948FE5C4EA0D11AA15BF89CC1C87D01EF583836784FCA53A9CB960406554EF2B79A18E5C266FC386F51B14415DDBA6BF35382D65AF24B9923E7A8AA47E5E44AE8453F062E8349E275EE571FA8023F5FA3FE58E848FC868CD78A156F32BBE3EB8815B80BB2C2104B07A3701DC486C471DE4699222B148AA ss = 8B439D25A81D260020D4F79C3B62A944 count = 40 seed = 197E5D562DE7E01BED4FC597DB28DC6EFDF0179F3A5BDA5F94CAA39D67BAE730540534D59A7A06C8448F628DA8B7859F pk = AB10F6FACDFD1CD7DBDA4713B1BF169D24FC04639DC320D52B2C18EA3F5560CFCCB2BD9A27BF3FC8999561F54B63F52BFEE130B852B17E3A5E788EB2FB831E35C728356553A2726DD1DD8E2C7BFEB4A610D5C3E662F483A248ECD43773CCC41733EA3B423CCBD79DAE69EFC5A0045958D0974A3F28FE676BB1EC2F903E1B37279100C8A83210255D11A8E75688F0E5CC50F60E8E9D919E03BB8D526088BFC4AFAAEAB2C2C31852D7B141CCF572E96C3C21428377AAC6647BD70A3EBE051BF05403940C5B93FF0798FC316E23F28232473162883FB20D664E62BCA731C36B5786317E2EEBC0D6BF3A0186EC80F0BA15EE5CB44467C64A85468D7CE10768019A63985667848643136930D7BC5CB555CBE1E56EE6C5939D699C9265E28D11F9EB8CA4E805982966F7ACAA69381673D5B2C19811792A55B58CBB72263D7266AC3D822C0A7958B2F414F614EC16CDFF787B3C103EC22B39BB480591D808B18B21BAF85ABF9D46733C2402FC336F1FD7423C7BFCDEBDA7E80DD2A9BC3F sk = 588760826DCFBD36D9ABE6AE44A669BB3EBBA6A218EAB69E0E860576285483BB5FD36E2F944D32C4317BEBC1E441470C1372046A790D7904AB10F6FACDFD1CD7DBDA4713B1BF169D24FC04639DC320D52B2C18EA3F5560CFCCB2BD9A27BF3FC8999561F54B63F52BFEE130B852B17E3A5E788EB2FB831E35C728356553A2726DD1DD8E2C7BFEB4A610D5C3E662F483A248ECD43773CCC41733EA3B423CCBD79DAE69EFC5A0045958D0974A3F28FE676BB1EC2F903E1B37279100C8A83210255D11A8E75688F0E5CC50F60E8E9D919E03BB8D526088BFC4AFAAEAB2C2C31852D7B141CCF572E96C3C21428377AAC6647BD70A3EBE051BF05403940C5B93FF0798FC316E23F28232473162883FB20D664E62BCA731C36B5786317E2EEBC0D6BF3A0186EC80F0BA15EE5CB44467C64A85468D7CE10768019A63985667848643136930D7BC5CB555CBE1E56EE6C5939D699C9265E28D11F9EB8CA4E805982966F7ACAA69381673D5B2C19811792A55B58CBB72263D7266AC3D822C0A7958B2F414F614EC16CDFF787B3C103EC22B39BB480591D808B18B21BAF85ABF9D46733C2402FC336F1FD7423C7BFCDEBDA7E80DD2A9BC3F ct = B13ECE8CD546758E5A087B9F1D332563B5DF735908852B975CE8B14D5B2576D02F8839D66753537AFF52382EFD64513E1A3274053411BC3F8E0CE8C742790944E27070256F992DA4D9453E5C74F52416382A134FD7111320689DAB6CDFD29390E51799477415CBF48D4FFCD76138C0626AB1C45975296F172CE764023F15C3E1E6447650A284E8BCA40EA9FD3A54E0FEFB365B7BEDFE33AB242BD177088DFAFF8B337A27293B5B4BA78314C31138B22842940EC999C6B58558499EF60C53E2B1987851CE8C13CA7A527F844FA9052596D157515C4378A06E1DDDB4B740DCE88EED71854DA267096B307E29D88DCB64DFD4A541EEDEFB0C406708A02D22F558857D98FF6BE1150011DBE443F9E6CE9E925D26A5BB0F29F1435242B64B48C15B8C944EF111C93A5216F1551D5C62B7EEBBB71A352EBE3A27E3EEA5143F95D3EA1729BF55AEA2FA7B0EA42BCCD4B83E53D4352675901F13E01B3624DF1E622E5DA5435ADEC11841FB127D4561B66515936CDA1157100EFF2621E6196B314CFD3E06F97976511026DC7511D87F076C1338B1825A ss = BEC47F1C887EE2DB4C56261F8A1BCCE0 count = 41 seed = F170583CB451D8A45D105457C02C01A33A40350616ED8515BD49067142F61EFB00F07857E4FFF3FE11E7164C648C76ED pk = 1F2E5CBA1FC922F7D7F0125B7E3C294B25CE775452D3EEE4D679114589C052BDE6E0E8A4871FC5F397D999D7AAC77F52D47D2B07AA20C69BB6ED77112B60302A0E7689101710C73E95C908896D39D8819D289DABB4253C93834688C4261000469D49C0DF3C489984649A900E2B38EFBB2755110330EB817DE23716371107D53CDEB07AD2F7929CE86C8BE5E61DCD0378485F646D1FBD16D266B293B4879475A413B649A94C83EB960A4102C1B277F656F791D6FDF3D1B1A32EAD0F952E743FC9A831F3C1586D4C03B4EDCDEB42B8BED94B455BE743289C19A418DC9BE77D8BA6836E95D836B6D24F4BBD444563941A7588E2C081AA38547EF0FCA9216E7AB3BDD3525F314BEF21F49CC838A75956F81B875693A8B0A76AFB6F12E3EB2DC5250ACC1D892873D2C8B7FD201E16233C50B2775B85246E9E82AF658011DB7CCF28FC95C6A8AB946F18F1BFD37EF9550080585E4BBCD0EA541A525E86361202D4433FCA65CCDB818A80F3440450384A81F9040EFB615930315264A229 sk = 47550E9EDACB6DDCE3D9AB81F6B61080DD4F2693854ACB05F89D7D99D5C3E0D10D6EF9AF054D842375F695ABB28E3B8EB495100F04306E021F2E5CBA1FC922F7D7F0125B7E3C294B25CE775452D3EEE4D679114589C052BDE6E0E8A4871FC5F397D999D7AAC77F52D47D2B07AA20C69BB6ED77112B60302A0E7689101710C73E95C908896D39D8819D289DABB4253C93834688C4261000469D49C0DF3C489984649A900E2B38EFBB2755110330EB817DE23716371107D53CDEB07AD2F7929CE86C8BE5E61DCD0378485F646D1FBD16D266B293B4879475A413B649A94C83EB960A4102C1B277F656F791D6FDF3D1B1A32EAD0F952E743FC9A831F3C1586D4C03B4EDCDEB42B8BED94B455BE743289C19A418DC9BE77D8BA6836E95D836B6D24F4BBD444563941A7588E2C081AA38547EF0FCA9216E7AB3BDD3525F314BEF21F49CC838A75956F81B875693A8B0A76AFB6F12E3EB2DC5250ACC1D892873D2C8B7FD201E16233C50B2775B85246E9E82AF658011DB7CCF28FC95C6A8AB946F18F1BFD37EF9550080585E4BBCD0EA541A525E86361202D4433FCA65CCDB818A80F3440450384A81F9040EFB615930315264A229 ct = 4B9B43530FF0A15D20E0D3E31DD29E02A93B4144D70A5F4D779917111916C7F79F9E11C433CA11499463D83894C04896DB00A73F7200D74875B0925E35BC3742E972F2B1222DEBCB7E1457112B1F7992265B4E66D567507E66068EBA3C4B139884FD2C438BDDDFC9536D8B5D4D963E84BEBF895EDCA44937BF361455AF31713B4A66199832F3831CC147D4DD055C8D9EA6558A2A7A003220434D8AAF25808D7028E9FE9FD36B961F85D51C4C157E1A8A8CF19F76E3347B7FE4EED7F73C1128D523F4C38677A2933F7FF4D462F91CB5233408D7BA92FED26DFE6D51D1EA79741279CE777BF070BBB1FC67A9C35B1BB263DD8AA38D07CF7297BC2FD92FD7A9031B7E4B6297EED234530067059A677BC306B3DB8220CA173A391C37892F3FB0835EF0CDCD75988362AB11F2E9412BC7EF57883AF5241680F37505FB269D5DE89C1A66E3E9A2BFC06F93D643F802A746ABB0CB052F1527FEF9DA4A78E7E700F03151094174D43C589F82D8331DC84E63F36B7B420FD6891BB96F70356A632BC56176D8CDA9E60322ED9843EAA8E6C9A0DC143435 ss = 64367D7F06B9FF57BB12260CD6D53AC6 count = 42 seed = 44A6774B2CAC02DFF210FF861A090561A453DB311F47B6FEDB81811872D5D9489F5FC4103010139AE53FCAED209DC9BE pk = 77F0362429A1BD4764B3C193B8DEB957DADAEA8B7FFFC016C273AD245D876288197901E789151E5429A8ACD710E30F0E61AAA9AAEBE53F83192C441D73F2254CCDF18F1ED5FF67315DCD9203C121573810ED176672165D9DE82E66EE83D5A6702B202C77455874BF6CE0C087F3A4BD6AF72EF3C74444D9A61542BA76B421AA78C310BFAF4EE4D83CA75FCC4741F83453DE1C7274939BE16AD6591580A24503B884EEFE8FDF2BEBCC80A7CD21FA1BC5830B61AB5BA1BD4E833CBBEB213E39835BA680C1FDB616C4D3C6611598B3631C19ACD020A680E095D748ED429345E44B3019AA5F10EC40497DCEC22DD4ABE19EF078C79525643FE7FDB4E34919302869E65C8548286B7BA24A9879074FF5EE55DAC533B8ED50732F853867E747D95E90B9672AC718785EFD5222ACF797C20779A91023533989EFC474464337DCB377FA7B840AECBC37E627206C8EFE2825344DAE9C7E816DD7ACFCED82F3BF6227795154F3FDE22698DE947A9F09757DE12B8DC1FFA3B10DD089BDE26519 sk = 610AFB64BE8CC1DF288CFB016EE2F44C6C07113DE7F6FEE0CD292E4C5F9E1A55E0489BCEFFB204D672A6215F4F3980A646D9F880817C520D77F0362429A1BD4764B3C193B8DEB957DADAEA8B7FFFC016C273AD245D876288197901E789151E5429A8ACD710E30F0E61AAA9AAEBE53F83192C441D73F2254CCDF18F1ED5FF67315DCD9203C121573810ED176672165D9DE82E66EE83D5A6702B202C77455874BF6CE0C087F3A4BD6AF72EF3C74444D9A61542BA76B421AA78C310BFAF4EE4D83CA75FCC4741F83453DE1C7274939BE16AD6591580A24503B884EEFE8FDF2BEBCC80A7CD21FA1BC5830B61AB5BA1BD4E833CBBEB213E39835BA680C1FDB616C4D3C6611598B3631C19ACD020A680E095D748ED429345E44B3019AA5F10EC40497DCEC22DD4ABE19EF078C79525643FE7FDB4E34919302869E65C8548286B7BA24A9879074FF5EE55DAC533B8ED50732F853867E747D95E90B9672AC718785EFD5222ACF797C20779A91023533989EFC474464337DCB377FA7B840AECBC37E627206C8EFE2825344DAE9C7E816DD7ACFCED82F3BF6227795154F3FDE22698DE947A9F09757DE12B8DC1FFA3B10DD089BDE26519 ct = 6B9F8886ABF9DDADEEEE3C619A8610E3CC9D1F950C9A9BC1BB0AE7F132F6F64378268852E98F65501063C7E181DCE1E1235452F633F1B59D4577E3175F473C0BC217EDF63F122F8F24F0158D2092DF96D6718182D06DB15FE28DEEB2F03B7BAF66DDE6078660939359D21A11506AB522057FDBEBC89DC9DA4521DE4F6719C72C97980A9569948E4D3D27FEB2C973D9131F3AF4744E78BF2B67D4DBA6C3D4AA477FB1E68C0A9A7F852802B8E758F1B79FDB7C06FC0A98B2B11E5F69E423E63E9DE45609FF147B236CB9C41FC0FE7BA02636080CA4E8FCC61DA071B50FAB056BFF70690A3B24FD9640F367BC429027AA3338440A7E535FDBC354C2300EE9EECB58CD59439B394D1A27EA47384C949C0A6242DEA52240D58DEE9695AD31D782983AAE49D2A5E6B00FF74D3926E5EB30803054D03F54F13A45FE476D2646097459B48515602B9D4D871584C7FFF381FABAD144A413B4816671FB272264200874A9AB4ED9306CFD9A72FD20709D33F1D99C667CD3D4C0D3886B0EDD2B3420DA6444B389BC573569BF3A73E54CD0108B816729B087 ss = DDE2935E7883F7596BCE6CE7183C2B32 count = 43 seed = 49E1855588B6235DF2A400C4A70AEDF8AB17B6E5E2891AA745F132FA2E7AB0C8117C1DF37C39F5D57624EB77C2B4A091 pk = 602A5A2B2616CFBA8718C4728D43D0B01F42E575E4C07EBF98651763BEA0935D693E7B25DD19CFF2991C5D4775D0924F5B31AC558880A5E64C9481D693A800BC8541199A9EB6AEB38C49DF2F28884E254FF23C1B406587EDF7A749A9680A3D190A493563C6AEEF16F19EB2DB0E4A1E24F2F6BF077DC962713099E039F801D5C368CBEAB827D331EFB0680ED7741B898A57A1C7F4ADECC51E2018C2F1578C10F35CAB371DA85D824BDADC11D05801BF4D5CCB6C8675D87C0E372B3B5A06F84CBAD3B5CE6D9ED15EEB7D8D159A2C063A81E8AFCD4D5D5AD8179E32962C400A005CDB3E00C50A78E6C0B276D9231947D1DFBA760F2DA385E3479D3911020184F5D186758F0506D624DC883438F295C6D41525FA52674C703D45256867FA7242519793DFE2E24A8E1C239E8DD96DE6E7A4C788829C7954D08A898CF235D67C678ACD36B76328262040D80680C39D810F9B694CE042520965B7BCB90034B4968704872F217F83D8EE2843C5C741F11D364BB01BF9E0F0621A56ECCC20 sk = E1953800ACAA85AC02A906C72CB8E8D704E8D27820345F888C64C049C6DFC0F1476CFFD520B055756162F7EC94243DE6B14AC0B9E5FB360C602A5A2B2616CFBA8718C4728D43D0B01F42E575E4C07EBF98651763BEA0935D693E7B25DD19CFF2991C5D4775D0924F5B31AC558880A5E64C9481D693A800BC8541199A9EB6AEB38C49DF2F28884E254FF23C1B406587EDF7A749A9680A3D190A493563C6AEEF16F19EB2DB0E4A1E24F2F6BF077DC962713099E039F801D5C368CBEAB827D331EFB0680ED7741B898A57A1C7F4ADECC51E2018C2F1578C10F35CAB371DA85D824BDADC11D05801BF4D5CCB6C8675D87C0E372B3B5A06F84CBAD3B5CE6D9ED15EEB7D8D159A2C063A81E8AFCD4D5D5AD8179E32962C400A005CDB3E00C50A78E6C0B276D9231947D1DFBA760F2DA385E3479D3911020184F5D186758F0506D624DC883438F295C6D41525FA52674C703D45256867FA7242519793DFE2E24A8E1C239E8DD96DE6E7A4C788829C7954D08A898CF235D67C678ACD36B76328262040D80680C39D810F9B694CE042520965B7BCB90034B4968704872F217F83D8EE2843C5C741F11D364BB01BF9E0F0621A56ECCC20 ct = 6B39A49EDC15AAECFD30C6004C18FC41E386C5829A525F5638B4EB9C1649E66A2BDB5C7CE761127575B20548A22FFDB02AAA85B02DC5C7E25A41BE4FAA4B1F2EFF8A161EC99BDB706028118771015E9F8A957EFED0AF070D3FF3EB52EF8F42A0D7E43CC605267CC6B4A4C42D0E70CD9007074E7533FCF38AEA4488385E3C6995EC899BC20E9FA0EA8981E334FB00BD7E67C683F4D48D97B63F081D9ED4C47914CA9A518BB957E1816DC38BD2E0A76BDCD316342E4533569E0E0E115E1D58A42C18835836A4A711AD84CD2233D548A4FC324876F47BB0BAB562339E2C86BF2BBF66A58BEEF780BDC57E32EE36C3B43AEB9F8CF5AA67AB1762B36E7F1A9F3804591FFBD59BE3F6D607A95B0786FDDBE023DD5A8F490205DFC93AA19FE23EDEDEC0F6D6898CE3896BE3BF74AFF88BC1888CF16E114736A6BCCCEFEC0152A32C14680687A41E190F5B710C3E7E55682026C31C893B653378502DE947A61820176BA5F3263F74C4BD816AF390BABB6AD563C93322C966DCC32DF2483D2249EA1361AE1FF0456A9B99FB6552A70FFB86F53BAB8A99 ss = 9F078C127285170CF8980292F8D73FAA count = 44 seed = DF0E41D2F6F86C1F79D31FD5878E7AB434FC0AF3A0D5F47D2AB3FEF31A42BD949B0E3629DF9F575BEFBB62E829E51DAE pk = 9DF10C6830490591503823CBF42DFB5BB2C2D9D5930C608919A968E4E7A16AC3B045A0B2E4358732FE62C935D22E40D6B5520391E758E8DAC0274BCF130035F1F8CB601D461FC6D1774C758BEF6AEC09F14524B80109FDD5384BCA2F1AF5F38B3EAC642BA1A7095F21730405BE9613D15ABD9FF9CAC4BDA95C57CFF6951CFBE8473120042497C38EDC87E1B20657AF295B55A1FC5D950235FFA42753BA42388E9D90E4D18F5915AF45E32B36BFADB72847B7DAD881502D7640A08C0339F95D117B3837DF4ABD2BF68EBAF19ACCA53AC3BDDC0BD1C02A0F39EB45FA3704D3B085DBDF36C912BB8ECF519C080AAD77019AC7FC41AAA6307BED960C5D01F4375A97DD2ADB94AFFBB1A624690948B109C2D6C4B2B2A1C25D0D24AFC7D3893060B2C2695F686C67015F09A60F88BDAE9CA4C6BD3CDB056930FB60B2703E72C51F6160226D73CD916E620161316E1D2DEBD4505DA951044258F5E36C6B3A8D2196831C53432D97A09665C1FDF5E67541D0BE0D1A291AEC06574288AA2C sk = C719F9B2D16399B7326CE4ECA30DABEFE8FDAAB18E9F6DF8E40771856EB77E4633504899FCB86C6A3D433D0B8D60E26F07BD61F1D4ED690D9DF10C6830490591503823CBF42DFB5BB2C2D9D5930C608919A968E4E7A16AC3B045A0B2E4358732FE62C935D22E40D6B5520391E758E8DAC0274BCF130035F1F8CB601D461FC6D1774C758BEF6AEC09F14524B80109FDD5384BCA2F1AF5F38B3EAC642BA1A7095F21730405BE9613D15ABD9FF9CAC4BDA95C57CFF6951CFBE8473120042497C38EDC87E1B20657AF295B55A1FC5D950235FFA42753BA42388E9D90E4D18F5915AF45E32B36BFADB72847B7DAD881502D7640A08C0339F95D117B3837DF4ABD2BF68EBAF19ACCA53AC3BDDC0BD1C02A0F39EB45FA3704D3B085DBDF36C912BB8ECF519C080AAD77019AC7FC41AAA6307BED960C5D01F4375A97DD2ADB94AFFBB1A624690948B109C2D6C4B2B2A1C25D0D24AFC7D3893060B2C2695F686C67015F09A60F88BDAE9CA4C6BD3CDB056930FB60B2703E72C51F6160226D73CD916E620161316E1D2DEBD4505DA951044258F5E36C6B3A8D2196831C53432D97A09665C1FDF5E67541D0BE0D1A291AEC06574288AA2C ct = 63D81CDFA2C580AA22C99BE7539D8E412BD6979A9DCA7AC4521A81950E7BECB4C24E942930641002CF6C2A614E34103CE8ADDDE47B5969F764563A2D342639838A3716E7C5A29A77373A16F6733026F75470D50D09ED2ECC24719421DC523A8046AEF782CCBA2A1283A58EEDD3130ED5D51393BA8410504CDA0C4738EC2E47437F727476B066753DD3AEDFEDE22B50A67363885E17AFAB3B4B4E8122C9726EB2C09BD2F8E6534D4960004413AE146F12A4819D7AAB24E156561811A507E740E095A2A0BD3531C55E047BE2D7096EFC6CCBDE1EFFA330DAF45CA4B4DF94376D12357B3BEB30064DD25828693FAD9D34CF8D7441E252447176862A7B211D950A2C835676380FAAB50C1FB789FC50FA1EC83D553058912D107665422C1A737E94BD2A2C70C340482805B23D0830654C27BF3E3A265281483B8346761786D6ECB4D211D36C79CFA24C8C3BD598260F88C215976E8A879DDAB3AF38E9D59396CCA5CF4A42B1085FDA4BB2C72B95E1BA88E781B3D6CC3327093891FA125F9933A7C8C39B9E1F4461C85EF444D17EC2757FA0B30466 ss = 4A6147CB62271297E148553A2232BCE0 count = 45 seed = D3C9EBBA6EB03CCB5C9B9D2C8D7F0CFBBF50841E24396CDDF0E56525B38918C2FBE6C34CC1B93F7BCD4F4D5777E1A488 pk = 6CF713DADD6EFB8489B21B60BA56066B7F6775D3502019B0087018D3702328FAE35F0F5B02C1D81247823C9E24444ECF7EDA0D6820BC07561743CA4ACB1F2CC916896B3CA64D6B74A0EA103A47E1C9A5B00F7F6999369820F16041C6B19F5ED61D118B4A3173AB9176F33A95A52FF70FB032E1AC2945086A9EE84142F421F666A0DE1BDF4D8129BD11D2EEF37520BE6DFAD4FC53ACBC3F09E5E740D6DE5ACA0C6E488DA5EA0A202FB8FA10C441BEB4B4B0BF0156E638B1BE28BD3D7600FED4A059AF623ACF3472485115D5135985EE418FBF1A54CD970403B5F966D258734A203FA5CA9ECAFC93C34B64C62FA51A893CA3A18789490FC0E4C0DD63161F382014D0960451D5D06D36544CABD7B6409BBEEF82B517BECD1C97B8CB3469E84F396276F868142B9B4DBA6FE790FA8B24909F09ABBB855DA5DAE0B33B06F167D2C77DB5B5976974D267E1AA7771E50C39B076956DC92C4D479B97F30562508768AEA7EA58BEF27F60ECEB5A630E00F39B4EB39F43C94B51B96208333B sk = E9ACBB774BE970206C3A738E243B420805A509FA59FA9020DED5EDAEC5DE3BF5B4D7C2F2E18E87F499C1968993EFF196753DB8045E2C8B086CF713DADD6EFB8489B21B60BA56066B7F6775D3502019B0087018D3702328FAE35F0F5B02C1D81247823C9E24444ECF7EDA0D6820BC07561743CA4ACB1F2CC916896B3CA64D6B74A0EA103A47E1C9A5B00F7F6999369820F16041C6B19F5ED61D118B4A3173AB9176F33A95A52FF70FB032E1AC2945086A9EE84142F421F666A0DE1BDF4D8129BD11D2EEF37520BE6DFAD4FC53ACBC3F09E5E740D6DE5ACA0C6E488DA5EA0A202FB8FA10C441BEB4B4B0BF0156E638B1BE28BD3D7600FED4A059AF623ACF3472485115D5135985EE418FBF1A54CD970403B5F966D258734A203FA5CA9ECAFC93C34B64C62FA51A893CA3A18789490FC0E4C0DD63161F382014D0960451D5D06D36544CABD7B6409BBEEF82B517BECD1C97B8CB3469E84F396276F868142B9B4DBA6FE790FA8B24909F09ABBB855DA5DAE0B33B06F167D2C77DB5B5976974D267E1AA7771E50C39B076956DC92C4D479B97F30562508768AEA7EA58BEF27F60ECEB5A630E00F39B4EB39F43C94B51B96208333B ct = 3DB4DDC2BF9462BE23C7845D56F29CFBE751B10F29C2CE294A1F09CB0C4557C9A07D7BD54D103670049BEFE5F67559B3F21E9B2C8A84FF780341E69B6B3C03669C2FF57F72F4D678662F9B084EABC15CDE90DCC6B0B1B14F71E4BF0702C4197FC7326065F3F5750DF7C2F8289E60F3304DCAC9159A066EF9F13580DAC911E11952DB379342E899E63973B9C2D89D7D712ED14EF04AADDB2E6B83ABFE5F7FF260C30F8F420884DD4D5A7D0EBD686CC45AA5F4A6FA778D3C761EF7D703085A6A9272E4F3AAC77DF5BB858E82C7FDEE00BB259B9734F6099725F87D9C0C3CF22F81AACB9E862D6185F7CBAA60C2DA3494709F715F11B50CC58527EEEC0AC8857F4CA7E06AEEBDEE498E6780C20A1FD5E6853D2E879EA69656B0D43F5B0530960292282A20B245F8E91F4C763AD997DF34B051B928C4F48EB406AF1539D155D2514A861246253430E79DBE204924CA40C76E3FC7B77B7092F2299B225BDB4481BB647F898E70525263D074763BCD8034EF5A0CD9A2CD99A1E61B5F3601BB61C9D6911FE657383BF18E129930B4D25D64B85F93B5 ss = 50892947CB223F9E90F01B5D18B7C069 count = 46 seed = 6B3996E8BC6F52879F2B7BE012C44AD555707CB7E5FD8ABB3457A298336D6FDC9EB7853008FF13201D5969A315C7E493 pk = 0E06629F6A29C0783125E0810B446FEFF76394E440ECB4674B2170128E805DA616FA75448FCBD259176C612EE69E63432A537214C743998DA42ABBAD798839269C9F028239DF63E0367908EEB19E7DCD30CDB0BC22CD13FF7EF717DA01FD5E157D9550EAFA285ADB287F768F8FDFC3E2B72C6AE4170B551633B784394C053F6EC0D99E879FBF38C1BED3656AF4592A1A8A7513BD8C61115CE00F4AEC61DC39F58D8A04ABBFE4273341FF84463122852C1AF2090173714A95B5A24AB014C360E2C887126BC3808941DBE66B9488B38FA89D67083A5813BF589906E34A17250BC3646C31AC1681FF0A7DFBA055158D06B9B3D5C902B129460C2F451032D5C1967100AF6AAC8686F1E80A7AF0AD4B5AEA97E0C2F57A7697D3F44AC251AAB7033F61712F4993F491C6765151170D30F064B2DB027D8FA269A716E4DA05623EBB451D9858EA1276C6D5A98EBD609CF9C66AC365A2B13745E4A38D0972C05E9709C7375C4DD2EC4FBD220E7A48B4E0EABEF8A1A13038DFE5F5E18B3F0B sk = C1B3CBFFAD4B306F9AF0CDD3028876486DBE858875C9B6491C96249919CEDC2369D8D739AB125E0D2CCB82DFEBCD90240A545CDFE07511020E06629F6A29C0783125E0810B446FEFF76394E440ECB4674B2170128E805DA616FA75448FCBD259176C612EE69E63432A537214C743998DA42ABBAD798839269C9F028239DF63E0367908EEB19E7DCD30CDB0BC22CD13FF7EF717DA01FD5E157D9550EAFA285ADB287F768F8FDFC3E2B72C6AE4170B551633B784394C053F6EC0D99E879FBF38C1BED3656AF4592A1A8A7513BD8C61115CE00F4AEC61DC39F58D8A04ABBFE4273341FF84463122852C1AF2090173714A95B5A24AB014C360E2C887126BC3808941DBE66B9488B38FA89D67083A5813BF589906E34A17250BC3646C31AC1681FF0A7DFBA055158D06B9B3D5C902B129460C2F451032D5C1967100AF6AAC8686F1E80A7AF0AD4B5AEA97E0C2F57A7697D3F44AC251AAB7033F61712F4993F491C6765151170D30F064B2DB027D8FA269A716E4DA05623EBB451D9858EA1276C6D5A98EBD609CF9C66AC365A2B13745E4A38D0972C05E9709C7375C4DD2EC4FBD220E7A48B4E0EABEF8A1A13038DFE5F5E18B3F0B ct = F4CEF7781207BFA19177F3B2AC8641A99C80641A61B9BC091A311549713968D3601F612617192FA5BA5486948AB670CECBD76972A242008D188D5E4B680C1B24A11277BDC58729E64ACD7513369A29DDA344C3947A05531698070E080372FF003BC9E269D1927D7BC6F4A59E9BD95E3FBD55E8FAE370C4A23B4BC2B5930CCF91B8278F059D7F476FA63F5B8E7791F30611042A0D13E405FCE4CC50F15C47F37777B65E484B19D18960B5BE43BDEC07425076437D29CFF084954D05C507B19D8FBA94FEB6500729E72CF3100052D0FBA8B3B594DC989AF64A50EE5CF06A820F8053F659CBE9DD2130EDD6C7C81F9FA3F78604A347D5E7BE16AB9C4928A9EB92A9E1F19B9D2C4728181CC16225DA76E21406D6F09DAAE0CDF163010906DEA72798B5E5BC284767669C2381C607D8DEB93BF614571F35F325892221160EB3FF9A2B06923C2C5FC8A9F79D2330087470A34CE89EC236BF1E3D77BB6F823CDF80B14E39467ED638A6ED5BA9B29E1C232041E2727F9133D618ADA9110F452A3B80BCF0E0D31113577E0280ED1DC93FFB453F0F4034 ss = C5950B09FEFBAFFF7D911370D2A3FA40 count = 47 seed = 730B65ECE22DE27D573CE3AEA7CB021C415DF210D228808D91D4F380070FFCB0778B683C71D4853DEB569C822765F2A3 pk = DF69854E0ED42A59F006E8C01367757A97D5A4F22A0514610780FFEA7F8D6BDA8EB5187BBB1872BEA6B2AFDF4DC03DA1FCD7B32212A33C555E2793D4F40B1D89F98C22677A88C52B90DBD624CBB1271EB8F3C1EFBE187FBBD45DD1092D9ECE8D336EFB21FB235ADA2FDADD236F0AF47FC100BEC6F6F95BEFE716A695410CED55261C1FA05882C1F47BD1013ABB8885F5E172E4CCAFC34B81D1598CB6DCA3C09ABE7107D661B0F7231DED12CC13E621CCB19C809DEBAFBFCD1522007C276120A509B334264B7035453074B3FD5E7444A625AA8D42B416BD646BE057C0FCF640D4E23A0916F25AE0B55209C9325F5C0BB1F7B09E8F23800F39D94CF73A707570D63E22C0CCA2F584102C52BCD908A0DF3753B867DDF857C3B65BDF5DE564F2101844664E1E71E6116673F546E326D38DA21940FDDAF94A07047DD11404990B5580E0520FEBD4AA52AFF8B3E43C7A3893AEB9299914132C74EBF315EC795736AD79A0B01D5256268F59E57F12C616D9307B3D1312254BB18243520E sk = FF7495B8575B5A98E4FD21FB4C3E58CBB60F14BEF21AA74CBDC370460375A778D1A31D01C42B66367ED8D9E8F84551002F552F0E52102B0DDF69854E0ED42A59F006E8C01367757A97D5A4F22A0514610780FFEA7F8D6BDA8EB5187BBB1872BEA6B2AFDF4DC03DA1FCD7B32212A33C555E2793D4F40B1D89F98C22677A88C52B90DBD624CBB1271EB8F3C1EFBE187FBBD45DD1092D9ECE8D336EFB21FB235ADA2FDADD236F0AF47FC100BEC6F6F95BEFE716A695410CED55261C1FA05882C1F47BD1013ABB8885F5E172E4CCAFC34B81D1598CB6DCA3C09ABE7107D661B0F7231DED12CC13E621CCB19C809DEBAFBFCD1522007C276120A509B334264B7035453074B3FD5E7444A625AA8D42B416BD646BE057C0FCF640D4E23A0916F25AE0B55209C9325F5C0BB1F7B09E8F23800F39D94CF73A707570D63E22C0CCA2F584102C52BCD908A0DF3753B867DDF857C3B65BDF5DE564F2101844664E1E71E6116673F546E326D38DA21940FDDAF94A07047DD11404990B5580E0520FEBD4AA52AFF8B3E43C7A3893AEB9299914132C74EBF315EC795736AD79A0B01D5256268F59E57F12C616D9307B3D1312254BB18243520E ct = 68DA11421151CAF9B5E5C2FCD826EAC60C86B1ADEF15F90E97D82844E198D6924F2618C0CA03DD69C801E92FB263BF6AD7ACF8039F9BEB352EDC7C2C0AD9156A2CBE42125A7AE99F1E96874A63E74C2D19B92B995E520852D4CD073B54D66D2629916531515CEEF7ABBBDC96E39D08F9D66F1D8E6A26FB1801C2FB192F32830F6014FFA54F64B8F2EF380B18412C39EB8241572B3F23A8AF8357B408AB9FFEF382C269E8C3114F61CF74CF2B96C84A148D738E47B6B2D1399BAD46EB3993FC0F75806AC699FE81F956564F7F521AD827F0D5C9D87CC33FF0B91109D32E0EB6CCB249F335CB68F812D407E5F1974C877F30781CDE47FA87525D5CA72BBFD18E17D73003BE9217E7548D68BB3BAF416F19BD43B470D7F4833EC991232136B6DE4CC67729B0AB2BB99834AF4CADC93A22A679E142B0257395EB8597386C6F8A93BA498C422F9F4A250AD5341F9A1C5150902881F09929196F9DD114731CDC01F01765709E40E0D7AA65B66B1B3DDBC8B632FFE638EFD7C907AA000237E8D9B40284F88B9A1DB15688CE3724FAA28865562C8F60 ss = D28A52E0A58E670E214D511D48FB2BF4 count = 48 seed = 5522A5A891A9A9B5514F4556AFD8DF40B9CEC63A01492F0CB8A1DB073A285A963E4A9FF2376C88662F7D8D241F8ACF17 pk = 282415CBE417099ADC28E9F82F22D2371E25F06294EBDB6A78A4D2A815BE70F7974BC715A3F97562F70B1674940A818C4EAFDCCDF83E28F00473E6C985D4373A99AB070958FDFA5036E4B5B824EDF759E6367877E87EF7F0D620BC2CB9D9F114B363D24BFCFB6AB8E09A09E792B27AC1233A69DA9C1D6DC46297ED95BE0FD89BA6E09DB720CA0E63E21898AA0C286E78DA927123DC4C5BE9A060E2909CD92EE3EB340EF378D204866AE368A4595AD35755116E231AD51D5747C0AF1414D281329154F629C3104F6840C8051CED6AB2A2E73AE8AA76F7349CB85C12DEFE80AA41F826663FA71E1E43270EEC78FD403E46C77E04DD7737D12491CB7119C1E3D4CCE167DCD5FC37F89574EA94F24745690BABB22C0F2000FA25E38B4D66AC2F0399433791E8A017E16CD79921DDBBE8426BD866AF63EE90B646373F3B46A146A57A4E132C0F3BF34D3C8494487FFC603E59720C6284975E252262E0CA59C697AD6A5E175EAFB6924CAA84C225A994EEFB948BA3BA14F158F9AC4209 sk = BDC3FBA1C32751139FC45BACFFB3EA97F26573D804A5F27AFD5A08F656A6EB8CD20679930A31CAA6A6331C4B133A6838C223EF9F769F6206282415CBE417099ADC28E9F82F22D2371E25F06294EBDB6A78A4D2A815BE70F7974BC715A3F97562F70B1674940A818C4EAFDCCDF83E28F00473E6C985D4373A99AB070958FDFA5036E4B5B824EDF759E6367877E87EF7F0D620BC2CB9D9F114B363D24BFCFB6AB8E09A09E792B27AC1233A69DA9C1D6DC46297ED95BE0FD89BA6E09DB720CA0E63E21898AA0C286E78DA927123DC4C5BE9A060E2909CD92EE3EB340EF378D204866AE368A4595AD35755116E231AD51D5747C0AF1414D281329154F629C3104F6840C8051CED6AB2A2E73AE8AA76F7349CB85C12DEFE80AA41F826663FA71E1E43270EEC78FD403E46C77E04DD7737D12491CB7119C1E3D4CCE167DCD5FC37F89574EA94F24745690BABB22C0F2000FA25E38B4D66AC2F0399433791E8A017E16CD79921DDBBE8426BD866AF63EE90B646373F3B46A146A57A4E132C0F3BF34D3C8494487FFC603E59720C6284975E252262E0CA59C697AD6A5E175EAFB6924CAA84C225A994EEFB948BA3BA14F158F9AC4209 ct = EEDFDECB83C3BACC3EE7DE64C6377E8AFB02CE89768D61366274AAB2E5BAD54550B1D7D9ACA70AFB236D9A5AAE390C02776B7D34DFDD65C09DB0C0856A2F2854CB6E04C0888D8E99BB1AF97260D29EBFAC1A278A71DB46FE214FBC0B6D9C44891CA1DEBEFFB69CDDD7AFF4AFE3988F2181DF4208FF40D4CF4D671D29393BFD9D424E27C598901C09D0F3262E0CF54D4411D68BFBFF7FDCA2A257091417BC8A5B5188ACBB1B2A1F3742877B0ABE4CA7FDE730E72DFF5B1FF9412DA2E61A678BD4A4FE0943AA75C60A5FADE3BA1779BE63A83A4DCCAD32D10688782AA16AEEC29524EB96AB230BCA3573E91655FBCF954BC58357F9D09C82A7B6C83F19DA0CF16386D2A050A1AD368344049DA22490255F057B927C2FA8359F55E0FCA605377A56CC40FAB85470A573B60863973BDDC1FEE223BD8EF14A9ACD3C571B28EBD9C83E00F448BA69121F49565385587C7D0EE36D10EDB902A307C39BFAC0508AC49F2BD4AB25198EDDC1C91263A4FDA546840DE8F84EE97C1E6C8A99026F3AFA99B2F569392F7F6E751BC556F1B1E86BC384C92636 ss = DC6232FFF7603332889FD1199627246C count = 49 seed = 1853E72329353B3F89AE6A1B1EF700DA8ED3C10D19F9E61EE9252E28EBB0E15802EE43083A12A0B7527088832605E3AB pk = 6881C771D8A4766F58BCFF0226044135C7FA37D6331821C334D244290DCA1066FB222E2F95ABDB65E5086B389DAC3166BAF93DB1CEB16906601BDFD5715910B00E60267C6D40B77C9C5B348CCDA6E9D09E5CDDD16E5CBC9AC8BEE6BAECA548B99120F4087A512577C89CD466055365ECB76FCC1F027071E09B56E287C11580F2ACBF9864C1B066CD927C293E2E4C8148C7D0602F1AD6B8B15F130F1CCFB159E4C77789D380D38C734D47556A3B1DA2061C4574DB36D1727D7905611C039B6660E06E7AA08F8F1190AE3F4F4E124A13BCF38BA30DE9D76AF1024236D793F18D2B46CD282895C08F52D3AA277FDAC4530463002E05EB2D56E911AB5E1E5E3C2D7269252D31DDA6E7C813FF94D37DDC203FADB7134FEF6325F8F20717961435DF2E7AD6D89A31F44E42BA9DE70DEE808A6FB37F1F2E5593658F686E032EF4F351C2951882ACF69577CEA6E59FD26DA3F038203F72D87D661B2A7C3A08F3CFBA4DEE28A71B549A3FAA39DABFC33E7F6675FFB32C0A845FA3F817BD18 sk = 447F6076A627BBC5AD7773FBFEB14B4BA9AC43A0F8B99FB620A7237801F470FCC2BD9FD7BEA8322859B850F7882D362947432913DD068C016881C771D8A4766F58BCFF0226044135C7FA37D6331821C334D244290DCA1066FB222E2F95ABDB65E5086B389DAC3166BAF93DB1CEB16906601BDFD5715910B00E60267C6D40B77C9C5B348CCDA6E9D09E5CDDD16E5CBC9AC8BEE6BAECA548B99120F4087A512577C89CD466055365ECB76FCC1F027071E09B56E287C11580F2ACBF9864C1B066CD927C293E2E4C8148C7D0602F1AD6B8B15F130F1CCFB159E4C77789D380D38C734D47556A3B1DA2061C4574DB36D1727D7905611C039B6660E06E7AA08F8F1190AE3F4F4E124A13BCF38BA30DE9D76AF1024236D793F18D2B46CD282895C08F52D3AA277FDAC4530463002E05EB2D56E911AB5E1E5E3C2D7269252D31DDA6E7C813FF94D37DDC203FADB7134FEF6325F8F20717961435DF2E7AD6D89A31F44E42BA9DE70DEE808A6FB37F1F2E5593658F686E032EF4F351C2951882ACF69577CEA6E59FD26DA3F038203F72D87D661B2A7C3A08F3CFBA4DEE28A71B549A3FAA39DABFC33E7F6675FFB32C0A845FA3F817BD18 ct = 37E8FCB261967D7FA6C356AEEBB59FBB5E4395325DAAAE48ED8A7216E700752B57C462FEA84FC440DEBC38832F74FB2D7493C54A86A23E519BFF5056933806C5C75BCBA5A604A35F480EE924372D4E16C1CA6E916744F4E3E64A28D70C0DB3B050EBECCE0A5DC48A6B642CC074BE05CCCFF2D628E634C6C2E5A21984FF3D12EFCC092435BC431C888C4CE0452ED2F1512C955F7024A9236846748BF22318484FB1C97118A92E7AFD78DB33A926599B4455386B21BF68AE56DEEF20F532D9D68A4DC0B1E54801A5F104EA3193DEE7C08A5BDAEA521626E527B0C2337F0CAB9B18E1CBEEACB40D2AE8537AE5308F59F984CE551C9B22011F090E29CF192B12CDDB6332F22ED8CEAC4D9C42F1357621AC36916AB7129CC8A8D4A61606A4485CC983AF50A76712F7C5CCA7EB118325A8EC81E27E9B30CA7D8B4D350E1A929A83F4BBC7051755A031551A0BF4B70C6582468C838FF7CDB25D02D122EBAA0F9AC984F7A62B60EA285AA715D06AEF526BCFDA1B91E8540F446BE81AF420B05FC75200FF3DAC7E294620011E5B4373668F564B0FB8B4 ss = 244944E9E0B7FFD0B370F7D5C5FDA850 count = 50 seed = 027C3D5847ED4470931141104F25B19AE76117CBB64B224EE424FFB782E9A0E988839E0BDED0DF666FE8E5FCBB5DBC09 pk = FD7F908C0614E30BCA5EDD2188AFDE9DA1F322E5AC2B55551B317023FF54DCED780DFA7C3D5301DF5FDDB60FD19C2575997CA4C700E1D7934F37A5AF5CEE3C01E8ACCCBEA788A75394C4C0B0EA9321D7BACFC40A0BC07A6613ABF55A2CC3EF8FD0D931EC145B862ED92243FAAA6A4E4E8E8858533AB78E8BDED384E3DC2C856409EADC18455420D953472093D59BF66D84968C28CD3CE6BF591840CFB014F8B5B2A5672728775EF7494303162AC87F314CA8A1A099EF8608EE26F04B20B773BD592C54B2D1623537E01C8367350A789887CC892158E3EC9460500F8DC046E81C78449E7C2C7D00F978D07AE6F53F9308D877E8CD1C8364C12E9E3926EE366C6B282E1347C53F2A5EEB67524A530E31EAF1C9DEFCCD2419070FF96D4639544258A91F7A6B6BF5FCF186CCABBC0134803C2F2BFA6A22EABB9A71AE22E97FEB0370FAAFE4B2AA4250921706E24D068EFF02AB3331E324A362377B3592C07FAD3498CF8D1EEE9AE952DF3BB43B3384B5EA1C261D8EB179E83D72DF30 sk = 2D5DF64D62CB07FE630310BB801C658DBF3D97993E6862677B534537ADDABA4ECF14F02AB317D36CB9F0F50222CED7CF029DFF8A0D3D2F09FD7F908C0614E30BCA5EDD2188AFDE9DA1F322E5AC2B55551B317023FF54DCED780DFA7C3D5301DF5FDDB60FD19C2575997CA4C700E1D7934F37A5AF5CEE3C01E8ACCCBEA788A75394C4C0B0EA9321D7BACFC40A0BC07A6613ABF55A2CC3EF8FD0D931EC145B862ED92243FAAA6A4E4E8E8858533AB78E8BDED384E3DC2C856409EADC18455420D953472093D59BF66D84968C28CD3CE6BF591840CFB014F8B5B2A5672728775EF7494303162AC87F314CA8A1A099EF8608EE26F04B20B773BD592C54B2D1623537E01C8367350A789887CC892158E3EC9460500F8DC046E81C78449E7C2C7D00F978D07AE6F53F9308D877E8CD1C8364C12E9E3926EE366C6B282E1347C53F2A5EEB67524A530E31EAF1C9DEFCCD2419070FF96D4639544258A91F7A6B6BF5FCF186CCABBC0134803C2F2BFA6A22EABB9A71AE22E97FEB0370FAAFE4B2AA4250921706E24D068EFF02AB3331E324A362377B3592C07FAD3498CF8D1EEE9AE952DF3BB43B3384B5EA1C261D8EB179E83D72DF30 ct = ABFEB8FEC833B354CAC958BBE1D840840D71F47ED3B3A5DEC0DD179C6724EF9903162F8F8A2542D6D0513F6C554997B268D370D1B348E58BAAC6121C7600045B8BE851282CA87AA39684F5D5A64077FCAB87F0649B7A64C662896FF2C6D640FC149C43551770AD67484CBB3F297B53055B9EF80789DDE1408C202481C021288B6EBF9D1898CA223FD223B3EB49A09641F17EA94C04549FE4995EF81AFF27E9B91B9673576C00FB0A613945331BF44D61ED1ABA96A129C13DF96D3C040EEBB0485ECC1EEBC72835849E0853BB9AF32E505F0D1D1C3409A0A5B56CA410DFCB5B02C2475190B229E6F2C181EF1F0CC819A61AB63A7B2CF1ABE8C6FFDE2C394CF9A467338563B862232F956A8508F6D3730F65EEB08BD259A243B4A6B7954F1274D6EC870A9C54508E93117088D3CE588CDFA4AFC993F55E65538E4A111BDFD2FBEBB70B8DE50D5841A2C066C3C912C1C2C4F0FF3648279666F9AE5D413D46E3105BC0167DF54E2D7BA3E53FD5E8213932651A1DF0C550622141CB106216CCB142E52400DC2BA6D30B2A2FEFDA0BA86C4E390789 ss = C4E28992CDC9C48F405D3CB3BA053AEB count = 51 seed = 450751D4401737459C6D93E6C5F2FBCC4A3AF7CD7250CCF404BBB817A67BAB7B4C9D0EF4570BFE25CF919DA331C31D88 pk = 3A993C13157B9BB2D4A3AC00AD76D36BC2E5B52456D0A163BC4B72F0B59036A7E7D760D481500C65E77432656783CC23955A4D4DAB7046F24F5E64320D4D030FE63E591E970A18A53CD7436FA906FD6B02360450B7A9B5070ACD261C348183D38857534AA2836CA38A444030628D51107CEF1AB5C2EE5E18EA6658BE66036AA95D146F62FCF6A5EB4808016E6D4085F44FA4DEF77023DD9A24E39EC3947073B0EF7F702DCBB9B2D701DDFA776E8C4BAB3AA125A78B6449EA0A6673B02146D9B8BE278FBAC942466B862CF57DD18829C14A54306482B544EB2508026EFF078D321929008693B065B7EEFB9CEA2FF21D8FFD35267AB090728D51E94B12D0015E6787C455147825FA3497A8F1A9F8F8B98615AB5FA371B17B166BB1DEA406BCEBB4C6D905BB7DA68E5369CCAA07E3EB848BBE1ADA82131E3A9892F126ACEF362428680157E232BCC8DDC1EC23F18493C0C727B576C9C7282BC2C91F917CB0EC745F60106AA69595E5BCAD14BA9C04D55D8606401ECC51FBF35BFB1F sk = 25056D1B8113BB362DD979D98643D7A7AC9C4F95994C0BA0F48A9254DD40B117941FA35A66BB50296327B725525DEEF70E128CA8045EC4013A993C13157B9BB2D4A3AC00AD76D36BC2E5B52456D0A163BC4B72F0B59036A7E7D760D481500C65E77432656783CC23955A4D4DAB7046F24F5E64320D4D030FE63E591E970A18A53CD7436FA906FD6B02360450B7A9B5070ACD261C348183D38857534AA2836CA38A444030628D51107CEF1AB5C2EE5E18EA6658BE66036AA95D146F62FCF6A5EB4808016E6D4085F44FA4DEF77023DD9A24E39EC3947073B0EF7F702DCBB9B2D701DDFA776E8C4BAB3AA125A78B6449EA0A6673B02146D9B8BE278FBAC942466B862CF57DD18829C14A54306482B544EB2508026EFF078D321929008693B065B7EEFB9CEA2FF21D8FFD35267AB090728D51E94B12D0015E6787C455147825FA3497A8F1A9F8F8B98615AB5FA371B17B166BB1DEA406BCEBB4C6D905BB7DA68E5369CCAA07E3EB848BBE1ADA82131E3A9892F126ACEF362428680157E232BCC8DDC1EC23F18493C0C727B576C9C7282BC2C91F917CB0EC745F60106AA69595E5BCAD14BA9C04D55D8606401ECC51FBF35BFB1F ct = C7298705F3D39D135D51B7EA600CF4673A2674414DF0D6AD1B9E228D6CD5A4736AC084324A47B71DF42B69EC9917EE699CD4587ABBF0A19CBA32F8D5FA6E0448921A0612B2C79E5A13DDE14BFCCBA16125B8A1DAEE2246934C29F0D8F78F70767502EA641C3F0A652FC062F7833DA1DCF92BF2A359D7489640FBF099B5139A15938079677BABA48619CE9F95A27A63E7AE03A1061E050FB53D45BCD542975F346A0E31372F80361AE970772D530C0BEB7683F354EA5AB7D70C679A9A209BF1B8624B6676C60C76675255AD3CE3E12937A85D7236C26F48716798F8F5777151C41AAD6FF14D97280AAA46B7D0AB7E85D8E1F4FB0B95C7939999288F0FB0443558C72D9470C38E04162F4F5A7271D0E8BBEC868CA810A22DB159BE8FCAB39198778CE211745F7CAEE8733B178728FC02F2B9E6F78F5CB39D93F8621F9E95BBBDEEFA7A5E40B210C379A7060431F3F735A62171518E5ABF926FD3C406773A3B1C68948CA6279D8D10EE0EA138E44F516D3FA075B38008299897340F8B2EEE6BC60200B0D4E90DCAF0EA07FA12A304A40D3FA589 ss = 35913AC0FA5A1FC2D538AEFAB8E94B6D count = 52 seed = 5DE720F2D152BF4E1F96A61E7AE5F1BED6B8548E32638C2CCEC9F43B87D1BB43DFCF334F0582984D27E440D519AB662F pk = 771D97565A58084F748614EBEBB8E495A94F06D334C0DD1408369420446E42ABA040D2B8C464DCF715FAF88FE0B1AB2E14070C0E09E87D6488B9528462AD11E4B7238EBCFBB80441C0CAC6AF36E5DEA280A001B2C24DDE9EE2CB0FB1F9990D39DBAE222FF5CACC945722D0A909BDB66B46A59C949D1A0AE1FC693511E134C2A738A6A0772648CADFE3E2D5056DEF930CEF5F6D9C91D83DB3C160BCEFA3079B32A8D1C7E8D2BD2DD85928F21B61F043B6D6E6BFD6D2703E224371C8333902B3F0F82F992757F78D8DE11C9A437EB577411D78C27F22B20FCE900957C80DCBEFE848DDF8B0909F59C70649C099C62611821615AA6F5A6F8DB84E4CAA3CAB097C05B39BC3DF05EB204538CA521B9691C263F6DDCCA1D2AE93068F129E4C9506FC04312EBE683C2E1A9AA69E23C81616AC3C10095D04F22EDA4BF02D3F9CD997BD08D31186EFA83450793585F14A6A4A94FB543446FD1A23B2D94F87420BFD1C7D2A16CB4A1D64D49982F02DF8041EC7BBAE41FA3FF3FCE9D4A6CA0D sk = E4D34E12982AEEB1D62FD488D9B9E28557ED3429292239FBE6C45C7FC62329B13C8D29844405DB8FF6860DE474BF727ECD19E54E6E1A140B771D97565A58084F748614EBEBB8E495A94F06D334C0DD1408369420446E42ABA040D2B8C464DCF715FAF88FE0B1AB2E14070C0E09E87D6488B9528462AD11E4B7238EBCFBB80441C0CAC6AF36E5DEA280A001B2C24DDE9EE2CB0FB1F9990D39DBAE222FF5CACC945722D0A909BDB66B46A59C949D1A0AE1FC693511E134C2A738A6A0772648CADFE3E2D5056DEF930CEF5F6D9C91D83DB3C160BCEFA3079B32A8D1C7E8D2BD2DD85928F21B61F043B6D6E6BFD6D2703E224371C8333902B3F0F82F992757F78D8DE11C9A437EB577411D78C27F22B20FCE900957C80DCBEFE848DDF8B0909F59C70649C099C62611821615AA6F5A6F8DB84E4CAA3CAB097C05B39BC3DF05EB204538CA521B9691C263F6DDCCA1D2AE93068F129E4C9506FC04312EBE683C2E1A9AA69E23C81616AC3C10095D04F22EDA4BF02D3F9CD997BD08D31186EFA83450793585F14A6A4A94FB543446FD1A23B2D94F87420BFD1C7D2A16CB4A1D64D49982F02DF8041EC7BBAE41FA3FF3FCE9D4A6CA0D ct = A0E26D84A08B798A2E04D6461EC95801BFD995F1B5BC7AE7B4F150855B145804AC941DA633759AD5363BEE5478C1A75450F94E6978D21EB2FD2AC561B1B60198DE37B9B84F3A1D7E67338A5748BFE386ED0D62B73F08D5D6A21CA0C099CC549E7DFAA72C08C5083A735F9AE14F255C479FE3B83D4929FAA86852DB4663083240422D8188935B884E7112A76052E355263FC7AE4EECD52E9BE8C11C57DD7BD17762456687BD1243F2C06AB735808C0E53F073D20200E5E7BA3559A593159206C903401167A1005A0E33B4B7382C61DB01F55FE4FE7211F52351E6B69B8D30FD46E198716B2F075B9233D951038DD585078448C312AA2CC6E32C180D36E6540B8411B6DF45A4EB5B0A613143EF1E1DE4FD1574409EC56AFC1DFC1CA2010EA9DF485C6AE9AEE4130185719AADA2AAA91076953DEA175A51776B66C10ADE0F1BAB96B81B725CB639554142BC422DA33F8EED93C9D0CE2D478E576268D26A6B77A4164A9D7376F932D9E79BC9C3EB723636D6E00905D7F46A2F2A3710898626464631E38F6355D6DD68EC60C4B43467ACF71AE205 ss = 611A6A572140FAAC867BE729608EC80E count = 53 seed = D71729DCBB27D7CB39E9E905025D3E55C8602EFBCC483C9B866EBF82326157833169243C14550AD728BD1470F39C642E pk = 0F2F08205E3FB2109300CE453C71371305353BB468EEBEE66170BCDCB52C94DBD3027510ED29C8A964151D6E2CFEA1AF466A185C213C8420ECA636D4C4C92FF0664B93C3B257BB815492D40BEA7B2278892600DABBCF70699C317EE539668EDD8C826A8B499800982EF73766037188BCB83606EA9A65DDBD167C5446161E39724897F5756330317712B8556277BD59175BE06B7259A9289676682F889B6E98020104B97E071769608F341F171938E3A4C53D6669E013BA76B8BC3819226F68A2621DD7A713FB4A8FD4750AE81B605F9678F26F0595B0E202E6B5ECE2F08B84D628FA3E7C7F5C35F969ECD67913CE1D0B3E03E789D1DFF20D668F012302422D7A170E2266276B1D5E0BB7FDAD7B13848BAB0940D9E4D4FCD7DF7101857CE84F6450898FF00B13CD6199F650ED503DC52AD5CF4EB7BBF9972ACD3940DD506ED99F1342EA277905915FF0C51CF425D6B26BE4092CBC6C5BF1DF1438DE8B33528AF02990FA222B076FBBA8345E994C07573DB9EE6D67B73648DF4D20 sk = CD6A99396EB3539CA663A51E42063A3A262CC1C5A5FCE1565A3407F591791A5DB4578B5972093A95BEC3B8E70C1D542C9B5C9789729F89020F2F08205E3FB2109300CE453C71371305353BB468EEBEE66170BCDCB52C94DBD3027510ED29C8A964151D6E2CFEA1AF466A185C213C8420ECA636D4C4C92FF0664B93C3B257BB815492D40BEA7B2278892600DABBCF70699C317EE539668EDD8C826A8B499800982EF73766037188BCB83606EA9A65DDBD167C5446161E39724897F5756330317712B8556277BD59175BE06B7259A9289676682F889B6E98020104B97E071769608F341F171938E3A4C53D6669E013BA76B8BC3819226F68A2621DD7A713FB4A8FD4750AE81B605F9678F26F0595B0E202E6B5ECE2F08B84D628FA3E7C7F5C35F969ECD67913CE1D0B3E03E789D1DFF20D668F012302422D7A170E2266276B1D5E0BB7FDAD7B13848BAB0940D9E4D4FCD7DF7101857CE84F6450898FF00B13CD6199F650ED503DC52AD5CF4EB7BBF9972ACD3940DD506ED99F1342EA277905915FF0C51CF425D6B26BE4092CBC6C5BF1DF1438DE8B33528AF02990FA222B076FBBA8345E994C07573DB9EE6D67B73648DF4D20 ct = E302E0545FFCC25CD015B5D3B17349A4381502CF54A9C8D28848DAA5E0B8B19482A39EFE94052AA67F604BC9C3FF2B7F03CB04C0C64959E795AEC7896CB80A704A0FFC9FEBDD8E20C25C4FA6A6456BA66247054C116D15577210501FBE9A5547358081235D341A57675721066302A5BC3149AF3EE965F30D48AAEA3E493ED5ECFE919BC58D3B1B83F51BA364AB5FCEECB4BB997BCB888C5E28CA44FCCC5398C44B1C2E3678BCFE9A533C80D50E3524E2D0D2A7274C7D734E1D7D90801C9C9EC4A6017B1CE4A86AF8D6C0FDB28A0E4E171A0EB4949AEBF6DCDFE3BD0309B463FC7ABBDA2D0E7836B9310930CEEC31EF832FA08E4C9BC4C5A528A105018D6AF262726C67EA6C25EB598BB6AF03290DFF3FAAD3FF2A7305D601D69B4E4620036FF39A3B035110BC3EF85C8FD79022B42F26A4AB177A00D809380692072B1B712C7A256541EA3C9125F0D1463F73991FE9A727B54A4B537C807CD6C111BB1963D0B6E704E95DDF7FE55C2DB0DE4FAF0934FC4BF2A519799F1B81081A4BAB8645C2CD9ED6F36135E94B598D4C9B1A31059628ED1B ss = 40D1B0F3D0438CBA1F0C51420EF5A622 count = 54 seed = A7C2C8EDB3601396BEB2DF0657EC82FD5780A2723581A9E03DEE1CDB018440439BB1142CAB0487C5D136E9AF46338AB7 pk = 272399ED0CC7DA890D56FE3744E373D32C18AF96FB485F753F37B136EBAEE5318F0DE3C38435D11338DC62761838B55A5C3D342C9D75CF375C56001A28852E49A87CABFAD3551FF2A8DB50D5650E6818F780E0BF24FA24E32E152BC4BDD97A039E19CC87644A345D85D5A69E8E067E4F60B0193E4662F2AB9C257BABCB136822F35250AFC1B0AA1617E53D306644535B1ABE84E9C24CD73519EA82F31A0E1487519FB96F281717E3BED8D8ABCF40A75FF7D8A2EE2EC8B38ADCAA223A2E818A6CF2D16287A077C51904B6CEE453874244826C52091EE2C7CB2DE37625054110D3CEA8C8E229A59CF246851F04937AE77F284E9DD0B3BDEA467D57C33B5F380838F5EB185CA7EE5C2AE8BAF2245874DC0E76A05088E8074076C53F431DF04344CCC12C6983676E6E677D6DC7FDF37884BB89BFBCBC2A0F540D3C310D8B9E249A03D318A0BC90A3D3D21EAC22213853A34DF007CEEEDD8AAEA6C4CA32238A67BA4DA9138199C62CCFD1EF322B9A4B95FB5D85DB628FB20B601FD82C sk = 6C8C53ED6F65E6B2E324B84364E10DE42D1C26A106D4D1C9B9402BF02481CE4B27A52E87FEB92C4399C7F2988D40E942E7496AD15AD2AA08272399ED0CC7DA890D56FE3744E373D32C18AF96FB485F753F37B136EBAEE5318F0DE3C38435D11338DC62761838B55A5C3D342C9D75CF375C56001A28852E49A87CABFAD3551FF2A8DB50D5650E6818F780E0BF24FA24E32E152BC4BDD97A039E19CC87644A345D85D5A69E8E067E4F60B0193E4662F2AB9C257BABCB136822F35250AFC1B0AA1617E53D306644535B1ABE84E9C24CD73519EA82F31A0E1487519FB96F281717E3BED8D8ABCF40A75FF7D8A2EE2EC8B38ADCAA223A2E818A6CF2D16287A077C51904B6CEE453874244826C52091EE2C7CB2DE37625054110D3CEA8C8E229A59CF246851F04937AE77F284E9DD0B3BDEA467D57C33B5F380838F5EB185CA7EE5C2AE8BAF2245874DC0E76A05088E8074076C53F431DF04344CCC12C6983676E6E677D6DC7FDF37884BB89BFBCBC2A0F540D3C310D8B9E249A03D318A0BC90A3D3D21EAC22213853A34DF007CEEEDD8AAEA6C4CA32238A67BA4DA9138199C62CCFD1EF322B9A4B95FB5D85DB628FB20B601FD82C ct = 3CCE6A0013A316F2B0ED0EDEB256359F6FF5F1FCC27E0644D0C2D9F13F93FB4DF11D6B0689DFABA0BB77ACDEB8459FCAC2A52BF6882753FC56E1E19F97153468BF2EB4D98580BA9D6DCA371069BE6D185803B99057EB9A6EBD522BF7099D437C8F3EE62C9A62F30A538509CB6B206A724E05C5A72F4F5865DEA3E810193F0E562A67A7F536C6C71F303F6EFD0CD43EAC569C83AA3190773E043A91F712FD030CCEF5B90B642C1EA9E4482C16211F9999F280CA64AF346C9BA099769106037FC2F079BF7880A3FDB7BFF3F83EA19A49DF6689B60270B857B273F8B9AC3FA6DE4F5A113820A35F350A015167A0097C52E7D02F39BD0B571367DFB6C71EC6ABD8974372135E9EBCF521D536D31B357FE79B23EA6756C268E7C8C4D4BC3DE8BA00A1980211CC3305FBBBC76CDB9C737B06EF8062D9CD38D03495F5FD142343678141F06F7AEF2756A2193D9766AE1978BCC55C8BA6C3C8554FD382C4888E488BE74EC09012FF931928CDF62B8BB720CD3C17DECC3DD85394C215E4175214737383C2944141CB3A1FBECF7ED91EC6123708A0FACB ss = 866E40E891E961606F2F289D83493A12 count = 55 seed = 467F6158CB86B724039FF18C47950AE5C49170163C910FC9A9B30141F86E9C06EBCEC91497BCD156D95758C9F0C6EF91 pk = 3EDDDE29C17BD70405A941C4B0484C764F31F91BC8F563729E43C6707798E72CE9E1EDFFE5D42724F7A15E072FBCA17BACD179EDF4825B17AADDFB59704D1DD415FE6E6ACFDE22B5731E2AFD5E33548FFBAC1EA7ADF485FA472336B80B191E3EB0D7DA4A15F3CBEF28168ECEE7C5305F5B7227CCCDA8F39DAADC4B2C5423FEDAE2DDC9A11CD4D6B83908FC5FB3858E586CC3403D7747D1848F433EBD49DCB2EDAAE32D8850F7C9AB874F98FB603E6E12AE48A0F7BD495DFB58459966356198E4AEABA4A99A5FAFDC42218833333B7C9FEA4AE4638BA53A05375FFD073EA16B4A1E1EE6146D70FD5756F276757B04BE5C0DB45792E211512CF995150D42E679A9704A0D99BE97EFE1D60EB55D65534E0FECA27D5BBEBC8A68E221B2530BD40B181F6C79D28C68BFE74C3A108995C9FF00BBD3AE15A7137E40BAD032B7E9CE785C003037840FE2F514D32B47384185A3A940875A7AAA814A01BF76777550063DFD24FF321495450E87A52560E5DEC5F9D71563050A3850CEB9E524 sk = 2107204CD995F1DF14314D5381F8C5440F09A347502E161C24C3DA70FE850E80AA818301D60C70F3038153866DCD5D179E22DB59B8991B043EDDDE29C17BD70405A941C4B0484C764F31F91BC8F563729E43C6707798E72CE9E1EDFFE5D42724F7A15E072FBCA17BACD179EDF4825B17AADDFB59704D1DD415FE6E6ACFDE22B5731E2AFD5E33548FFBAC1EA7ADF485FA472336B80B191E3EB0D7DA4A15F3CBEF28168ECEE7C5305F5B7227CCCDA8F39DAADC4B2C5423FEDAE2DDC9A11CD4D6B83908FC5FB3858E586CC3403D7747D1848F433EBD49DCB2EDAAE32D8850F7C9AB874F98FB603E6E12AE48A0F7BD495DFB58459966356198E4AEABA4A99A5FAFDC42218833333B7C9FEA4AE4638BA53A05375FFD073EA16B4A1E1EE6146D70FD5756F276757B04BE5C0DB45792E211512CF995150D42E679A9704A0D99BE97EFE1D60EB55D65534E0FECA27D5BBEBC8A68E221B2530BD40B181F6C79D28C68BFE74C3A108995C9FF00BBD3AE15A7137E40BAD032B7E9CE785C003037840FE2F514D32B47384185A3A940875A7AAA814A01BF76777550063DFD24FF321495450E87A52560E5DEC5F9D71563050A3850CEB9E524 ct = 9B34D90878FD0A9EBEAA19B7C48786799FB2F92C5B49FDD9F5753367D773405A6E5D3140B66B065450D83EF38CB40E54CAAFCF850263292E992579BBD5CD0F99CFB60E9F3B2B4A6A6E5E5C366F833220C92E1796EC841E673BA0833A5C3A4390C8857E4A416E17DFB1C1E7B6991A4AAE4DA92141EC6B1C282D07CD2F7308DE9937D635CF769AEBE0A247AF5492CD07DCCB68551BD6D71772300537CF311BA2B99BD8E0E479BBD14C1FE606FD51182BBDF26441ACAF72621C514DB9D323A04B07099B69994F9FC2CA74E432258DE420F7CCEDDA44AEE6FA918DE0EB47A3CBFE2BD675806D15AF09DF071D198A4C23D47BA78A75D26EB7C658C064A53239518BF135E5E927216017665ED5ABC66E72D393282318D874A98DF4738C110AE38FD192C6D7FD3F96B626FC215AD878228701E7A25C858775BB2CF1AB1F0235EDCADCA9652669F65BF9ADA0A64F174373718179A3FA756D0157C0DA9E70E1FC06CDA7416BA91FC0985EE4987B1884E646422F7354ED046A5C93B42304336C11245EAAA559B73E8420DA8AC675E1887FB4C827302623 ss = CA0D7585046662311189B3592F76645C count = 56 seed = 687C02DE1041ABAC7B2C1E6EC2A7C3375552ED5EDB10E3A8139C24CC76BDA44D719D8121A81D47A0B762B4E9EEB85235 pk = 6B1319C8117FFFA442B0F1412F6A7D6D0C7408DFFE495790A79A3C8B4D147912E7617F70C87BE6C11A7EECD34C41C51B05F39A0D45B87EAC7B96FE092E6F08C5510AC68BC5CB09EF335D2FFB77CE1291FF80E765E63765A2FB14773908B9D4D072E0C61961BE84281B98389A20241C7F12BA082DEEF8ADF948680D965B0431BC1F07C5590EFDACA02287D3C34032B88F41BFB9E408E10435784EAF2CEBAE679F962386CBB445862067C0D99DB53164477D375567CF835DC983B0FC2E1D71BE7ADF03B26F3177BB0947A1BB55EE70D5919DEF18261D33FE5CA36C6E7FC7D6405A84D92EAD1CA2FE8307350822504105FC72D0C951D0F4DE3D4B605E29DF181E5CE2443E0EB97EBE91595B58B5E2F2E56C8848F410746685A2049D1941DD806F72D83B2682C6D95E0E4E130C272A2E0422F80D4D655DA043DED68D3935F41D06AB744B3627E81234574162D02AB7D5A6B038E9522F1762F86694231D7CD048210DB1576C86E3E70B2588BEB1B1ACF59E56E201020C7E6C54129B34 sk = 63A925685A8AC5BBD918FAA33AC397D1FFBCF99135D9DA7C3AFDB8A246A56EE71465591831C371F2EB87467B0559DEDD776BA063EE6D2F036B1319C8117FFFA442B0F1412F6A7D6D0C7408DFFE495790A79A3C8B4D147912E7617F70C87BE6C11A7EECD34C41C51B05F39A0D45B87EAC7B96FE092E6F08C5510AC68BC5CB09EF335D2FFB77CE1291FF80E765E63765A2FB14773908B9D4D072E0C61961BE84281B98389A20241C7F12BA082DEEF8ADF948680D965B0431BC1F07C5590EFDACA02287D3C34032B88F41BFB9E408E10435784EAF2CEBAE679F962386CBB445862067C0D99DB53164477D375567CF835DC983B0FC2E1D71BE7ADF03B26F3177BB0947A1BB55EE70D5919DEF18261D33FE5CA36C6E7FC7D6405A84D92EAD1CA2FE8307350822504105FC72D0C951D0F4DE3D4B605E29DF181E5CE2443E0EB97EBE91595B58B5E2F2E56C8848F410746685A2049D1941DD806F72D83B2682C6D95E0E4E130C272A2E0422F80D4D655DA043DED68D3935F41D06AB744B3627E81234574162D02AB7D5A6B038E9522F1762F86694231D7CD048210DB1576C86E3E70B2588BEB1B1ACF59E56E201020C7E6C54129B34 ct = 771416311ADB3F965DB35A8000987A64AFAEF47D526587A24C25A45358D71C773B07B22E3211ED9577C3E177140600B64F6D75CE8B88B0DB78B971A9E3982F98FBD07419B4AF178F653EF3C4F063661B4F16ADE84F4EF602F2CFB89A63F2A68AA65AB878278FE95EC5AE8D2D7EA06DD5EBC3DE6B1FDA05BF9934776C9D2ADFEBD9FB391D2C49190EDF4E8742292C815F7E74299F2DF9BD5619BE48FFBEEE23C5C918B0DAA4AE326504A7F41248A92DF93973113BE962F18AF9F9A2A02C31DD6B62BBC7A6EB4F0857471AA0F1ED648AA1E6F0851DEBE8A56CF8DC2FF64454DECDFBEBDEE5920141AEDC0370590666436C0FB24D54D036855B14338807BF2498D789E9D665AD9DA9D63D61AB0E827CD738AB04C4BBE26476CDF16948E4868AB67C457A50012C37193A054A41590C4D375C5763A0E86A49B510B25C1033A035310691A1FC2E2C1F765B11DB4C72DB341D12E0807C092FB8A153AF8C9B701CD3FB49ACDF1E761415B86512E5AF841EA23D5F8D9B6FCE1769766D26118A3B78ECEC26852CC106AAED9D81E7CDE7F878A55709B881 ss = 4C202A19F5C63CBCE9783D5CC76BF831 count = 57 seed = 4142237070C216BCBE245A39BD9220533C97651D84832B26727855AD994A0760C52B9319AD404693E4248B8C5FF324B3 pk = 6D2A89C69923487EDE1BC34A8A13B155E7F9168D213D70D7905FE2404D4622D1669F7A4042B8A9B544CAFC65BC003FE713A2B2FC7ADA4055655358A669F92BA93F265C0F0E49C2FEDF05D5A3829D760F3A306FC9F5FC679EB3461C9294AE82001CA57D5C4E9D9D3F56F9064457BDC7117077FAE8A957AD940135BB6AC40B2B6C07C175ED665309F9C9EA39524F072231CD206C816404D710DCD196414CACFD7480DAFFB57FF37766D84FCDD3526A7E0FBB365816C6BFCB4A531F9E9F327F6AA13DA7B7B0481A5938D2A91FD5EB8020BAB66B5D0D6BF99C54027D0DCE93B090044793EFFCDCB3959E33822B5F851587B728A77F58CECA18223D07221D701FB4994D62BB6DE992453364A204FC1F3816432A42F178299E93C69E992900A9FDEC8532B064F87B9EE684907ECF2D587AE9C7A21FB3BBC515D188DF831D283A261435A359E7FBE876E7C8BC5B2004A2A196BE2543416A088296C0A5AFC42D2C036866A595720FC216C62082FF7B811BFD7B0DA7F0B7C08C58EF386C03 sk = 6A1AEE5E708C1B47F02BDACCE4F56C860F74FC7CFEC1EF3B230E05B7114FF0395CC6634DB1EAE8258072D09C09F291E92D6620B177DC50076D2A89C69923487EDE1BC34A8A13B155E7F9168D213D70D7905FE2404D4622D1669F7A4042B8A9B544CAFC65BC003FE713A2B2FC7ADA4055655358A669F92BA93F265C0F0E49C2FEDF05D5A3829D760F3A306FC9F5FC679EB3461C9294AE82001CA57D5C4E9D9D3F56F9064457BDC7117077FAE8A957AD940135BB6AC40B2B6C07C175ED665309F9C9EA39524F072231CD206C816404D710DCD196414CACFD7480DAFFB57FF37766D84FCDD3526A7E0FBB365816C6BFCB4A531F9E9F327F6AA13DA7B7B0481A5938D2A91FD5EB8020BAB66B5D0D6BF99C54027D0DCE93B090044793EFFCDCB3959E33822B5F851587B728A77F58CECA18223D07221D701FB4994D62BB6DE992453364A204FC1F3816432A42F178299E93C69E992900A9FDEC8532B064F87B9EE684907ECF2D587AE9C7A21FB3BBC515D188DF831D283A261435A359E7FBE876E7C8BC5B2004A2A196BE2543416A088296C0A5AFC42D2C036866A595720FC216C62082FF7B811BFD7B0DA7F0B7C08C58EF386C03 ct = 86C91E6EC454EC80779399FFE0B109312D41E7E385EC7EB1AF45726279388C76A77F7AC9B252B365F2D70EC56D19584C9693DA07C37F55D43F11844D512B0AAEF5DBCCC6870C3002188FF37AA488F11FCE52C5783FA26B8181BB6A903D0AE4D2CED85F7DCA3BB2B114789A6CC79D4E48032022E1FD3088B8AA4078471C27A573C2B054A6F81ED1A8250D4136C7FB38D62AA002998E98F2A8634EE1CF6CA6088C1D1CCA99E921231EFB907CEDA9F5C26027B421416C9DD65581B34C9C18FC1B8F1C4DDCBF34D1589C5D38421377BB71E9445FC32B8394B63C34BB3851F150AB776442B771A259411699057CC95584BC4D259ADF5B4CFC4445EC1A5807D358C7D5D75CB6E80E26221435B3D1DF31305256B83A48810567AF6D2D871BEFBD0DE7465A6BC79EF83147283B8ABD6D1F6A58AD9EC776047AE5E05027BC04C3F629524510C4A05134B0099FE4B5C2D082498929EE25073E16660645D547ABFB88B506124571F940C3A82E17CE6F577F1BC6C437D74D3B72CF3A1596F6007AE094C860A5B85ABBA331BE2700267B4C4180169694A43E ss = BCDB0612341C644C1E49A67D3E5DAE5D count = 58 seed = BD334D7B7EB14E00E68863F2E5551A095F8AF10681C28353FD19B9A7E70B8BFE266840860609008A567ABC66316C77CE pk = 79D60D3B20762812250E359F4EAD8013AC6945E600097DCF220DFDFDB0EF77778E6D5831038292004BDC4CCF3C3F9A741401E4BC36C4398C2E2E8E1E13710F9F97F7E9C83C65DD8DA7DDFDD7BC4E355F6AEDB7680291F43BC740535FDA098FA2B43E6C765E195AEB05F2197FC427BB2323AEAF0D353819071A7F0071793863596388D29327C976B53621E73809269D9A76AF0E8BB48F613FE910A11334046ECB7BE1E6ACA632AB9816A9D0BA7757D972DC50F827DE04AABE9C51BD7303717CA9D16C14D169C814BF5F5BAEF2A3255BD440C91239A3F104D3568556763F790E469F8F0D86A06139860CE70420037ABF9F3DB28AC2C09D06D7AC137B1D1D4A24C90C0A3AF1EB6724A0A34D549DA83877BF3F40A5559994CD9062C836A0CFFCE230A83CE9903863B1ED8D78CE01EFD1551FB91B44F096F291E50D8636CCD3BEBC9620CB63DD37F49D607A0D5B8B9CF0D0E899E26687FDBC9114BD9BC53DEE1393AA2DC4191FCFC9885A91796F9B2FF31CD331AF8BAB786CFC992B04 sk = 6396B328B100E4C7F4BCAE69875EDEA1A1982421558C608C1100CED48ADD211A5C937B8D6079D8E271AF3F949EDC61F70E60453AEF20DE0979D60D3B20762812250E359F4EAD8013AC6945E600097DCF220DFDFDB0EF77778E6D5831038292004BDC4CCF3C3F9A741401E4BC36C4398C2E2E8E1E13710F9F97F7E9C83C65DD8DA7DDFDD7BC4E355F6AEDB7680291F43BC740535FDA098FA2B43E6C765E195AEB05F2197FC427BB2323AEAF0D353819071A7F0071793863596388D29327C976B53621E73809269D9A76AF0E8BB48F613FE910A11334046ECB7BE1E6ACA632AB9816A9D0BA7757D972DC50F827DE04AABE9C51BD7303717CA9D16C14D169C814BF5F5BAEF2A3255BD440C91239A3F104D3568556763F790E469F8F0D86A06139860CE70420037ABF9F3DB28AC2C09D06D7AC137B1D1D4A24C90C0A3AF1EB6724A0A34D549DA83877BF3F40A5559994CD9062C836A0CFFCE230A83CE9903863B1ED8D78CE01EFD1551FB91B44F096F291E50D8636CCD3BEBC9620CB63DD37F49D607A0D5B8B9CF0D0E899E26687FDBC9114BD9BC53DEE1393AA2DC4191FCFC9885A91796F9B2FF31CD331AF8BAB786CFC992B04 ct = A78A062B9B784E4104DE8729007821C055B52E3FDC21E1E63BE3010473B07AEA415A15F89461B92B69A41CC884C15439C8D42E249459BFB496A9A916D02C3F8E643D5F07927E4FFBCF10B36A356C1A67BF99C87F7E49AE5B671F8AD135BD8C6E507C337732F2CCBB61A21A1A5F68C43AC8307E3870E0706087CA25D0C12FFB86F4BDAF1DB3DD9837233D6CBA74B6B7F3EB2E1E4EC582A0D3816152FE812E2A3F9B68A67A2A7038C985840A032571477C2D50320CC9A76F922D14DA5E115CE2CA8CF9145B4A6B29AABF82AAA1045B369F6C9A00C7DA469CD9070B641CCF6B32F6D9C58BC93C129F227F28D4A1124C15400A4BABD45DE969E414F0180908DAF9802415181E7D23CA62E371AECAB64EDBF525C00A33B261814A399FA099372F24EEE11F291D0FB7F8FEDDD791D6BBC66791BCBF60D9F1A94C5E54360B766E3F7401153A7750BC5579EA330D95A0F3ABD114CD9F8C14737661127230980E6EB6524535EB911F6961DFED2FBAD069F6EDE40ED11F47FAD601A07EB904687D558038252ADE0CB9F106824AFDDEB3AB58A31739773E ss = F8A5E526945388C27DC5F5DEE3F1A242 count = 59 seed = A0264C58AB1F2CBCB212077FD378D340307ACCB31F1312137CF84E3D3135044D4EAE8BD38BC3E540A0C14D46458F6179 pk = 55380A7E3C64B3D9FCADB872F18F9B73AD97BBAA08808C380986007DF9DB3D444F91158BBDA5597C392C592CAF058149A46DDE8089F1ECD17014B7F7F784136B5529273AD2FF6202B610B3F64D2A48CF931A6ACF6037A4D12CB1019B17F3E75BF7B4FDC806FC2A8E745FEBAF3B8FFB4BCB13A438F17997D15C28DF6CDE0B36E18F27EA52EE86E74EF7AD57BC5F315D32C217B6A504C7F004E98D63C318B8F0ACF6CB7A5194882DB598C040BB2E689D9AF3ED351B05B485A1B1B63835064823FB12C6FB7EE015051ED6CAF4494BDF230731C417E38812C51BC4D602774529A190B73B704618D8A3A23139B98619B00EB718F8469E5B0A17D706FAAC1F77947DC8289C2A570658A47383629C8160DDC1A9C98B89B12B1CA1224E0B836383357151E2D5046F661743A4C1E38DCC174E514675F56CC7CB7D3288C43B3648E41A8D4563D8DEAF98FF11D0133A53BAE6C6D9C11F084B19F37405FE362B07349DB2CFC4E5A71C76A4A99AB73A91045BB9AB25CF1F87175BC4D2B7D3E824 sk = A453BCACDD2B0D4646009E5ED451C3C45F08FB827EF733DB7A3CC8AA3239D4C52CE4C95AFDEFF6EFBFACAC10D294EDC0E7CF4535059BFD0A55380A7E3C64B3D9FCADB872F18F9B73AD97BBAA08808C380986007DF9DB3D444F91158BBDA5597C392C592CAF058149A46DDE8089F1ECD17014B7F7F784136B5529273AD2FF6202B610B3F64D2A48CF931A6ACF6037A4D12CB1019B17F3E75BF7B4FDC806FC2A8E745FEBAF3B8FFB4BCB13A438F17997D15C28DF6CDE0B36E18F27EA52EE86E74EF7AD57BC5F315D32C217B6A504C7F004E98D63C318B8F0ACF6CB7A5194882DB598C040BB2E689D9AF3ED351B05B485A1B1B63835064823FB12C6FB7EE015051ED6CAF4494BDF230731C417E38812C51BC4D602774529A190B73B704618D8A3A23139B98619B00EB718F8469E5B0A17D706FAAC1F77947DC8289C2A570658A47383629C8160DDC1A9C98B89B12B1CA1224E0B836383357151E2D5046F661743A4C1E38DCC174E514675F56CC7CB7D3288C43B3648E41A8D4563D8DEAF98FF11D0133A53BAE6C6D9C11F084B19F37405FE362B07349DB2CFC4E5A71C76A4A99AB73A91045BB9AB25CF1F87175BC4D2B7D3E824 ct = 06A2AF7C92E7B49326F0859AB182F020669CD37CC4C16A8ADA2567824AD47062349E5B65977E3BACA2C1E5F9E267FBC2BF6FF23D252ABE697F5BC0C45D6922B2A305778688AA4542DB38B8CC5E7DE6630F61A6C34F1705BDB2FCBFE9A72B3C21A71300D07BF02260E93D4D703F1995710C85720261544B0D3A491FE99002E17C8915D722C98886B5FE133562D64A259AFB1C9BE05C3F51D85E07C4E5A517BBC4C3EEC4919721D1BB02D411409657AAF73A623BA1348A27691A849E590F2457129BA28C798FCA2C5A9ACA75FC9D8D251D7BADB81FBC76ECCB22D98ED0AA12D6D141F3BD905337207043170276489732DCB5B7FC1DD00AD2032A030F3298EEB9E9D9A57998994C9D66382D0CC200CCD647D37254D8DE27D98264F8D8CD00B232FFE28AE16EF605FB504DC8DD9B7A49F8AA7B851EFDC0CE1C7A8D9D2712496B7F3321130D17B5AF4F51895D72D8C17FE00576EE8C047426C6658AD0055F6828F26FAB0C182705F88CF98D84956BB3A674569A2B176B8AFD05BC8D0ECD3A4A899543AE192BACB7AC6BAF01E34F5507D0501C0A01 ss = B691E2F6CF111770164E0BC987BF29C7 count = 60 seed = 99A9CDBFC674AB3FF2C64CDED7D697A6E27A767434A47AFF7C3FBF3C6A22D6043D27868955286A13EFE3DE36D22EC48E pk = A946E01F62D730B029F61B0D6AE1C4DB4FAAB8B3A381D07210AE19D799AFAA2DED4766F82A7461E846D89B50A7268BB3F27C4694D29CE95F7A6CFBC3E7C6066282D3CD66A509BA71F5C162F2699CFB0CF884FEFD3BFE2DC036FBB36CE56E4E1A2BFD24CA6B9EF77D808E17925CF2D9AC7C7FE75C6C0639EC3F5F7B38D422CCDAF4B08047798957687A6F715A03D16F53B8475EAC4629FBCAF81CED52FA524AC88D00D46639694F3FAA3EB35768F721BDC977819329ABF41D62E64D5D13258E8B5C9BCD067EEB98424F786C7937101B2F46E4AC862A396D4AE3DAC9AFF4B71967A3E329C979139CD9A06B47D171D6C172AA1F0520676DC4DC2DFC5E2EA0EBA6102A8ADCE25045241DE39FE1403459C147876437531D7CEB3642908127CF1F8D653481281E294B8FFD672F0F64413B3967FD044ABB2141B62610021ECB974AA2A4362617A79AD53A2101272094654F6E2A5348B5ECAB6FA4E214FD0F9175DC3DBA35DD18857D610AF904034894F6A6C8F7F268700EED15CECE5824 sk = 47CA2B77C5B717F423222C2730CA5CB9C856BC951D01B2B28F1481D7CAB000E33FA07DE8DC9627A85E76FABB4428A3376E66300CF12A0707A946E01F62D730B029F61B0D6AE1C4DB4FAAB8B3A381D07210AE19D799AFAA2DED4766F82A7461E846D89B50A7268BB3F27C4694D29CE95F7A6CFBC3E7C6066282D3CD66A509BA71F5C162F2699CFB0CF884FEFD3BFE2DC036FBB36CE56E4E1A2BFD24CA6B9EF77D808E17925CF2D9AC7C7FE75C6C0639EC3F5F7B38D422CCDAF4B08047798957687A6F715A03D16F53B8475EAC4629FBCAF81CED52FA524AC88D00D46639694F3FAA3EB35768F721BDC977819329ABF41D62E64D5D13258E8B5C9BCD067EEB98424F786C7937101B2F46E4AC862A396D4AE3DAC9AFF4B71967A3E329C979139CD9A06B47D171D6C172AA1F0520676DC4DC2DFC5E2EA0EBA6102A8ADCE25045241DE39FE1403459C147876437531D7CEB3642908127CF1F8D653481281E294B8FFD672F0F64413B3967FD044ABB2141B62610021ECB974AA2A4362617A79AD53A2101272094654F6E2A5348B5ECAB6FA4E214FD0F9175DC3DBA35DD18857D610AF904034894F6A6C8F7F268700EED15CECE5824 ct = ADD7482CE5D3611273D876BDB1769A7198D5FE4168920CBAD2EA1D557DFCE7584C4ED3CF9AD401E12FE3287AD8FA9D02061109F405C8A1406304AE275DDF1B33BA787A727A29AFF8660546B2ABB9EA683EF2818B6D0726D2B71C9D90892F5C4BD367CAC12CB66053EFE2A36D7BF4A49205F47B6AB0734DFC2451B919E63C90B602670B764AC7BC0C39542979D8484D49C9637D1B7F05D4787C4240BE385E06A59D07BF474E36985EAC8E04801B9255F10223E20AEDEEDDAE371C9DA609911F2C6F3BABB1742805469999CC95C7CDA1B3E10286630B755F40D4C1EED12FD1D2AA4FAD7422F521E89B35CDB18D7BDA464A2D1B83AAAAB69A430E376A274D437CB6B601AC40ABAC7DA79EBDA6A7417D899A21ABA073B7A19B2BDADCCF13A20A2DF8E7EF9E3126C8F52763C9A03227CEBDD441C999E30685D6F6F4C3038BAC6683A637C36A14C1A34547D75CFCDA21E56DF42E8116092F66234CB6D0648CE6AF4479A1F17AFEC23FB48A1EA74F0189F4ECA4F9BD1AFB9CF64D2C382CFD46D42867BC08D3A27362B57ABD59E60F99A56EC2532F40 ss = CD46C969AA5DFEA2E170905CCC89AA13 count = 61 seed = C799D57B41F28C5C446DFC58A5AC6499C4BCF3C162AFD2B09A16549826EC2A6F689E44BAFC4ACC82F5D6AEC23F4A3993 pk = E2496A4E000054EC2F545122E667FFFD6AE4616339799F5E631EC3F70504409E6FFD933F7307EA1674002DD7442A7B5361CC07C0492FB47C737B32428BB33B8DB1DFE23ED99C0B3F02BFCD88EA9E9AC8C537B773BD0950EFAD1D9A83F780BCDFB4D9238501AE3CAAC4E5C70A19979AC316D9FF903433CA13F31C169BE708410C8D4421E9A5E784FC90EF2CC4CC1C47BD86F3056E7A43C7819E7054C5E116D58ECD1C864B1C623018BF62CE283BACC405502A65791D6B4758A2F7102705AD795C3464DC7BCD94503D95C1D6E618ED44D4C75E6DF264429C663DAEC426F8D5404DF7304B757136B4DF1E9306BD35229DD18AC000652DDE20C58E13832109DD95785FFBD6760B0C475E546383CBB6C9FF1A810D55F9D79F8D02AB7D5B58FE053FA26A0317E3E9519AA1D632F35AD4F3AB836C7FFCF7C3C2D0DBC12607E4C7708653F1888D2FF863D6AD43857DE9ECA28535F1F88AABB52ABB67A458952937A0DB55E1857B7A5A709550388158BF8F2AA600FFD777F11AA4B97AD019 sk = AAF6EB40E596A5E3E8218871E708B089240DCBE7FD3641F0E2F8D320AC3CB0C52EFDC753282F092BC39BAF4A18783A48EA031A191865EB08E2496A4E000054EC2F545122E667FFFD6AE4616339799F5E631EC3F70504409E6FFD933F7307EA1674002DD7442A7B5361CC07C0492FB47C737B32428BB33B8DB1DFE23ED99C0B3F02BFCD88EA9E9AC8C537B773BD0950EFAD1D9A83F780BCDFB4D9238501AE3CAAC4E5C70A19979AC316D9FF903433CA13F31C169BE708410C8D4421E9A5E784FC90EF2CC4CC1C47BD86F3056E7A43C7819E7054C5E116D58ECD1C864B1C623018BF62CE283BACC405502A65791D6B4758A2F7102705AD795C3464DC7BCD94503D95C1D6E618ED44D4C75E6DF264429C663DAEC426F8D5404DF7304B757136B4DF1E9306BD35229DD18AC000652DDE20C58E13832109DD95785FFBD6760B0C475E546383CBB6C9FF1A810D55F9D79F8D02AB7D5B58FE053FA26A0317E3E9519AA1D632F35AD4F3AB836C7FFCF7C3C2D0DBC12607E4C7708653F1888D2FF863D6AD43857DE9ECA28535F1F88AABB52ABB67A458952937A0DB55E1857B7A5A709550388158BF8F2AA600FFD777F11AA4B97AD019 ct = 603091FE4CC2161FC3C9C514BBA8783CC0FF7738DFA45CF72CE8E27415984C79384D955DF0075A51912732EC71372F38E17FA5F898BF1E79138A4E52C1CB3FBA5938772F045A3988DC9B05F25912845D64543C16C8A84F11AAFFEC30B3B6DAD60FB945AF7192B5BB0840BBB7D78097267FA85FD2A61E934A8C98A5570B24D7418AB4A24DEC606F6C84E6A611A9D5F277396C1783B4AE46C2825E379A0CD875F28A0AB807D8678D9AAA10D73E5CAD6352919669B990D4A41F4300925B06ADE61E989CCA250D570CF66E59348B811DDD6CD19E12B33EA17501BFDCF66C94AEDCC2E6B86C60F24054DF83C0AE3B63B4948B26C12DF34CA8ACB9A6AF3F313F71ACC69ACFBC46DFFA89E3CC4E3AA7DE93963EC1C4C57375DA3E6F365EB68C8DE9D8B3B968666A2B1F3481EDA65625BD30ACAF341919E11C8C542F72D537182181B435EA7ED2638BEC1654CD118FE7BD6544BEEEBA51B71AAF29905E5ED6CD18B6DCB060DFF7DB617BC339514E15B000522EE75C7A4FB74075C7147039DBCCB0B6DBDB27C136746E19D20E56D5CD3D12DECD6FADAE ss = 003CD451783593A761402EE4AB2A4734 count = 62 seed = F7AE036A0176A9DE9A036A542DD2840033277C44AE936D10B768566216DE9D4395CD42B116873B69D9804BA6CCBC05D5 pk = CE956094326ABDF77ED13D3A85B5EAFBF1B4D4ED41E4E3F76F2B5CF8D20DD28F4B46064589FF3EDB866A4C3297873066F41683F084A5E9A8624B799270733AA72296063A559FE5DC663A2A5E092EEDE75C2BBC3788D3EFCB50C656B36F5F30104033ADC9500C8C329A113340E418B036851C27599947785D691A2724CC03BDB0C8EF395A6FE518B0C6DF0626E1135F852E476C2945257C5AB15DC6B5AA68EF26F1A0533D5F4315B6C6010010B5CF5DD93F89FE773A09033FDA80906F188C1D22521B514F07B8F5DC8996A37209CD107440C3952A98EC592FF3009E9008AA70E58681E6F60EDD587534060BC8468A64B3E020C18E81BC1A2DE8D6BC30624F731BB8DD50137B3C0DC23C2264F98A49E6BDCCC62BF9CA6554D3707F351FA4B700AA9DE28F122FE35BBFAD4C2E5334ADB835630DC25B026FE69A94BB17FFEEEF6F358C6EAAC4B50A5E3F2D4B0023568D75EB6BB781BBF80C1A7B22F6FCCE448A7A5BD86F1F17C46325386C6EFDDB767A8D79EC2613146A3ABFF54C1E sk = 6500F32C93415CFDBC0BD31D78D5BE95CB9060C8CFA20139393308641A9A4647F230201E1389624A296B55192A9819FCB19AB77C25F95405CE956094326ABDF77ED13D3A85B5EAFBF1B4D4ED41E4E3F76F2B5CF8D20DD28F4B46064589FF3EDB866A4C3297873066F41683F084A5E9A8624B799270733AA72296063A559FE5DC663A2A5E092EEDE75C2BBC3788D3EFCB50C656B36F5F30104033ADC9500C8C329A113340E418B036851C27599947785D691A2724CC03BDB0C8EF395A6FE518B0C6DF0626E1135F852E476C2945257C5AB15DC6B5AA68EF26F1A0533D5F4315B6C6010010B5CF5DD93F89FE773A09033FDA80906F188C1D22521B514F07B8F5DC8996A37209CD107440C3952A98EC592FF3009E9008AA70E58681E6F60EDD587534060BC8468A64B3E020C18E81BC1A2DE8D6BC30624F731BB8DD50137B3C0DC23C2264F98A49E6BDCCC62BF9CA6554D3707F351FA4B700AA9DE28F122FE35BBFAD4C2E5334ADB835630DC25B026FE69A94BB17FFEEEF6F358C6EAAC4B50A5E3F2D4B0023568D75EB6BB781BBF80C1A7B22F6FCCE448A7A5BD86F1F17C46325386C6EFDDB767A8D79EC2613146A3ABFF54C1E ct = 7DC0798455B5A26CB05790521AF3D45C88097EFEF2F830A9141D2B22C453D0D4B0D03D7E43E1F0901F593E1DFBC47AEE3BB4F41783C9ABC2926A97C3907A3E4E0F7485085D7172D085B5CEB7B71ED0F2E7A36D263009AA247386CD72253FE736D3491CBDEA7A0CA5130E050DC597F8CA3E2472264DCFCC7FE9AB07946F02F4E9462AEF52D7C061ED483F9F23498849E51AE9B357BCCA2FE1BA57FE159F40A0EEC1A3D6BEB9BEED50ADE070F79FC7135286DC4D7A7CF1361067F73B41242BF6AF8ED472F9C88896D8480B5FACC7706C2E4B6048520FDAF6E90073260957A9C121546B1402C5946E06C288C490C4F9F708336B744EC2D4D05A443CCA3D8316BD9EC4C8E54AC2FB4E38A39B16966E656D10F5AD630A5D0CE7E686B27D2A6E877CB21F73CD3842F5917F03FB9EE48BF79633B73217CD05C1DDFCA8AD07A7F3BD4C1D5F3435AF4A9B8068ADCD162A9F107C65E1322B70EB15E522CE00F5DEBC995B5544FEF5C85170B946C4729E482E4E44C29929150D15FC5BAE4D1AE526E20E25FEAE987E29A33A24F009D131D7C06B15559DB4 ss = C703F50DA9CBEA117DDA3F19CCEC719C count = 63 seed = D995D38F934B6E1A7CA77C9522E3D037676CC939B0C8BD4B84394B3DC91A791F09D2D97199258C9943DA955E7F7B26FC pk = BD9243DE189E15CB45C6767CB179EB18047C5ABC559325AB44B4D319E665636F2950C673930AE172B87B2C7AE5985DE2DEFE8BD8430844377AD9F905DDBA07EF4BC80BDB80E5B681182A72FE4FA6B87017E3DE0CD34F515117CC08AAE91F6D72DF7675D56F0979E9E0C49CEE40A0728A8FB0EAFB75EC27B6DE76A21C510EFD378B37B067978F11F219D82FC94BB51009510C6E15AEF66D2FF82FF83A1106D1D954A1EEF7BFA2A8C414CE045CA8FB4A7E0C15C60274194E2DE8111285020A631AB2F0F34EFA18247EFEEEE1B48835B6AE97FB4049771D2D907582F3340E89C4E167E15678910C8ECC5B882561E8733E1EAF12E30EF8EF3B82E676282C891C450979663024FEEBD3AE27F2E5506EB6EF15A40F06746547305EB562AB5209ECBDEFC39ECD28EED4412EEC2E710846549A6CB9F3C5CA49A4F5E3D2CE35AC3B9DD1223BDCF7ECA86FBAEDE5B9144FDD082D190F46F83A85F6D4D2D23A6BE85FF81B489F229011C5A333A9D724D679CCB259DAACDB4E46108A27226B20 sk = 7643CEF2D62CC5AAEECF754653EA62294CD2208E5BF3DDEEEAC9D531A532770837A854B4F5531F6E0C8D6C10183B30D3435498C2DD142901BD9243DE189E15CB45C6767CB179EB18047C5ABC559325AB44B4D319E665636F2950C673930AE172B87B2C7AE5985DE2DEFE8BD8430844377AD9F905DDBA07EF4BC80BDB80E5B681182A72FE4FA6B87017E3DE0CD34F515117CC08AAE91F6D72DF7675D56F0979E9E0C49CEE40A0728A8FB0EAFB75EC27B6DE76A21C510EFD378B37B067978F11F219D82FC94BB51009510C6E15AEF66D2FF82FF83A1106D1D954A1EEF7BFA2A8C414CE045CA8FB4A7E0C15C60274194E2DE8111285020A631AB2F0F34EFA18247EFEEEE1B48835B6AE97FB4049771D2D907582F3340E89C4E167E15678910C8ECC5B882561E8733E1EAF12E30EF8EF3B82E676282C891C450979663024FEEBD3AE27F2E5506EB6EF15A40F06746547305EB562AB5209ECBDEFC39ECD28EED4412EEC2E710846549A6CB9F3C5CA49A4F5E3D2CE35AC3B9DD1223BDCF7ECA86FBAEDE5B9144FDD082D190F46F83A85F6D4D2D23A6BE85FF81B489F229011C5A333A9D724D679CCB259DAACDB4E46108A27226B20 ct = B299CE6702196439BA77EB9CCED77848129554AB4C769AA38FB4B5F45A9B0CB22BAA0EDFA55DEB998A1E2F72C42A3BB15D2833DDB57AC4BB484032F4D4390ABB662EB544C53AE9B391454881DD936B92CF2132737481D2303C3D48E7FAB653FBAC4B932B9294FB30B253240897E4702CE078C14DFE372D3B0EC17B8ACD00D8B0D0546EFD122D306B5E371272CD1321BEEDEB09E777E4B7AFFFD65415A588117B444F46E334BAEA4E1D06CD6689A86CAE36E074D1E64E595EA20D138120C4EAE891D24C8C1BBFDCB36716063838AB7138CE02915CDFDC53B29B69C0D795A0999032A9FF732D8FD631C7A6DB6F1E73EF55AE40014B7294FCEBBE60A607FDA204E75A42813385AFCA2C31532F8EE93EA9E3686DBF54C82560EC51D1E4DAF80EA448D96BD4B7E9ADBA915FDE0F5F30C618B5CB2527B552B30D1FF5F416533EA1482BD742BB7F49B5726DD49D6887EBF94B99C2E6C136D978F67B6FFF5F7A23F9D457DAEAD5A6139B6C86E2F5D1700CEA98DF3B7AF2F26D7082CB31188FCC6A5E305BD825E7344F7B9D171E01BE31453AA8060FA1 ss = 6353E3E351F88595AF940EB23A4756C3 count = 64 seed = 5929F02A271725CB40200DE32D9D03D8BEA53B53AC83186C42C7F565CCB1CA508305D470850CF86E9B2C61A5B8CA1C93 pk = 7BC613BB6E6B1C6182269F6879F737F79E79A3040987FAF718B8743FA97169F3F85BF6152CF846A8A000FEFE8AB56FD632FAB9D1B8B53D107C872B8A3A3C05B0141DEB35CC85D61188C45C6CDE567E79B8EB962CE6539B88F534662BED38CBB8F243119967946992FF424601DA4FCD3C88D7AC44437E0FEFDDFC572FEE183B15D5A9F64EFB60A2C74A46E5781430BC6A66FC99B7137981BF414E2D99FFBF040A7BBE28C5C9857116A5A2D278646AB01B2269FBBDE14A6646AA838ABB31BC7121D343D4CC5317BCDE624C4E2CD243D1AD364CA06656AC2E297BE782BE6A9F1CCD966BE558B3E120C67B24B17501EDE12A46D4BE3B108CE6250DBCC704F95EBC1B8DE8E939236D0297E051D473813D68F68F4F5F6D7C981B59B41D70DB620AED9AA7C26A6474E00C3040E14E20E758C374C68565F0628A0EA7C19531C385346C5C7375A90C2FB9B08036F79F9F6B2284B3138CA303F453F47E0A4116B5B675B81C63F7BBA9954610E0D1B9DBE48D55DD0E290864D360BA6FAEDF13 sk = F8EE95521060C03BB8DACC79F7EB7DB640F545F315613A353FC3D8392CB53F36ED647364A04E37278A0E0A45B720F4A75C580C9920EBA90D7BC613BB6E6B1C6182269F6879F737F79E79A3040987FAF718B8743FA97169F3F85BF6152CF846A8A000FEFE8AB56FD632FAB9D1B8B53D107C872B8A3A3C05B0141DEB35CC85D61188C45C6CDE567E79B8EB962CE6539B88F534662BED38CBB8F243119967946992FF424601DA4FCD3C88D7AC44437E0FEFDDFC572FEE183B15D5A9F64EFB60A2C74A46E5781430BC6A66FC99B7137981BF414E2D99FFBF040A7BBE28C5C9857116A5A2D278646AB01B2269FBBDE14A6646AA838ABB31BC7121D343D4CC5317BCDE624C4E2CD243D1AD364CA06656AC2E297BE782BE6A9F1CCD966BE558B3E120C67B24B17501EDE12A46D4BE3B108CE6250DBCC704F95EBC1B8DE8E939236D0297E051D473813D68F68F4F5F6D7C981B59B41D70DB620AED9AA7C26A6474E00C3040E14E20E758C374C68565F0628A0EA7C19531C385346C5C7375A90C2FB9B08036F79F9F6B2284B3138CA303F453F47E0A4116B5B675B81C63F7BBA9954610E0D1B9DBE48D55DD0E290864D360BA6FAEDF13 ct = 710FA214C02BB2B832188B6CB6C9F66BBC26C94BB3724AC5405DCFD5C614B56294FD05C8133758F78FB31EF3DACD98F404B934FD2A4747B66AC339600B963458407DF968AFCD97BD6A125B8AAED89BFF750A2D2956596CC136EC9B97FC362878325062F3FC6BB12914D2B34177B0284748AFDE07C212CD7BE376C3A5061861A41536117C4F5E864762F92870F39B92452FA42EE03B2CB90CB7FA2796E392F058CE6B0FBB33F28D50D340D33DF71DB2B8330476827AA1AC0737337972142512746F31F230E5F431D10C06BEAF7B65CAB286346146BAEEE85BC81BD59B713FAFF5BF3FE96E30F75B14DFB9307C7C695A55C7B6B185F88AC3B00A5F5E2810A5EA8922AB3F9613D39B69D6854DA6F3CD5EBC51A25C7B4D827AF9BBA38678E839E3EE87186C48F9CE52CF4EF3B2480A927F55D21CC19A3A2A6E4396812C8567451B81532D6B785DBC9AD686A26E390ADF348CB19243F090D2912467D6A4E09423099074363CEFA6F957329B51724A835D18387265106F7899DCFCC91C7877756B1F9002DF661C49F5CE6A7BC202AEE3AA043FF3ED ss = B9EC435D5568F1BB8153E1D11B62911C count = 65 seed = 905074033D7B75DEB2D06A2F29144EB377B452534C5710632989F02D45312D156557E96D4486020826DB200153BC4A8B pk = 000912DCF30216E62A3CB863665C9AA712FCBD5690C67AE96C6982BFE6B007F6DE84DF6D4250DE55865948C5D112866CB46781C8A1D4DED38D90CA71438C27DB9379E303D3370FAAD11FE424DBFCA3116823C1FFE46277EADE5EE9A818EC12A63A33644CC1A3396F2AFB047F4D61FA78F53213866CF0FA20BCC70DBDBD29230844128949B228FBF76F74A3DFDF51D39EFF67CAD7AC18043F06F3EDA2D9AB6B23A1FD77F99DC066A6B2168B32EAF4765E79917C43A8D967E0FB839F132948EFE3535D0FD5641CAC539C0F7933F3B6B292B217937FF15D2ECD545EF5865D4D98B8BB1A2253994C6EDAF353611860912B6689C2C5F0D214633B3AD1973773C09B0604405A532566CC9350AC9DD5F3CA538BEB05B12A9F25184F3128153EC38C28E93EDEF4F8EB6EFB5E71324145F40AE41CD1AC0D07BB3EBB7157110BCD7A07609FDE07C6442EC0307F959DF2C1560554563F2589E4AF3DBBBB1DABF563AF293C8FDBAA1978DC2AE340A7CF76A7FBF37CC2B65A02D8604338E59B28 sk = B8BD0493A882E3A49B4E0F6256FB1FEA0912562FD9BA26ECD7E4B5D8021C486B9C3114D7CBBEB7CD49EBA8A61BC2BCAE1F1BEF30A1DAF70D000912DCF30216E62A3CB863665C9AA712FCBD5690C67AE96C6982BFE6B007F6DE84DF6D4250DE55865948C5D112866CB46781C8A1D4DED38D90CA71438C27DB9379E303D3370FAAD11FE424DBFCA3116823C1FFE46277EADE5EE9A818EC12A63A33644CC1A3396F2AFB047F4D61FA78F53213866CF0FA20BCC70DBDBD29230844128949B228FBF76F74A3DFDF51D39EFF67CAD7AC18043F06F3EDA2D9AB6B23A1FD77F99DC066A6B2168B32EAF4765E79917C43A8D967E0FB839F132948EFE3535D0FD5641CAC539C0F7933F3B6B292B217937FF15D2ECD545EF5865D4D98B8BB1A2253994C6EDAF353611860912B6689C2C5F0D214633B3AD1973773C09B0604405A532566CC9350AC9DD5F3CA538BEB05B12A9F25184F3128153EC38C28E93EDEF4F8EB6EFB5E71324145F40AE41CD1AC0D07BB3EBB7157110BCD7A07609FDE07C6442EC0307F959DF2C1560554563F2589E4AF3DBBBB1DABF563AF293C8FDBAA1978DC2AE340A7CF76A7FBF37CC2B65A02D8604338E59B28 ct = B466E61CF90D5CE11392D4F87DA07AC8E700B673512B094AED8A6B065E61A4C1761870BD436324173B773D7B3F044FEB9306BC6D27480BA425E6CE1501BD0791CB4085F0A48F1DE71D9D7A82FB828DF468CD45742BD108E0F7D692C2BD70E221D5CE4C67E106F5E0F6BBBA29F9E6884FA5FEA3AEE4182277824FC164D80A8D311DD723005EF04865CEDFB80B71500447D812E9DC9E00E59B64FFE7C5DFDB4AE05047D11C077F913FEB49C5BFE29E57C88C11375A00531515E7B7CE5A23A189AED31F6B6C735311FA0CAFCA609ED86EBB35318DBDD4E2D5598E679E98BCBED7FD708B7A277D1FE7EA75B08B70CD73D82CDAFD6CED8DDC3CA58C7DD004AF4B1E92A21233C69AD581EDC702A8CF9DB7E9E33116A819C4711BC179BB7D4CDBEAEBDF194AB4040EF615D7646B66C689EC3E362C0855A6BA611EA2359A026244249C7B25719032568DB438658798903AFB6160E03A2AAAAB2C134B254C8F5F6753E6D403832B110E54E13064E56E4CB61E35A41D370EA384B6AC67612C073C85AE35374DD5C014116DDB651907A06CA4A2F6ECDCF5 ss = BED32BD3C8A0F9D270BABBB812BAE14F count = 66 seed = A3E2E511AFA7BB560446BDADF67D2EE2E16FFC7BAEAE7EFB8C5455068BBD4E91BF9BE9D98B280072FABA7712C75B26D4 pk = 198231B2ECE738116B8E716830579B4747EA32CD93C1F2026FC0B0BF4A608977912A8E61B24ACDF60B2D9F89B54795782D82DCBA07E6874BA64CEBB73592354353B97A2D2AC634BD9EC0C8495DEA7C24027D0B65B0B3848C5EBC61455B0032838BBAD62098581BDB125DA6248433E5A60DBDE1CC65F6E8A8E19653E9070C66326146D0BD71CDAFF11FEDCA7E4A89A8E89C10A8D3D35CDA59675B8DD15610719B37C6AEC5E80848804B5CCDAB2A3382C77592A6AABC34F4FD06B7B69A2F0C60D063DFD1901E7378305BB3BED982F2C65D82559B95C57620A23A562D63E65F2C6C81F95C651D8856D646394998C3590CDDC55D126AA9F41AD69A941B008167F6DE68A23CE9FCA68EC8CBA4C05AEA971877D04C0FDE00205ED2C715762C4C523D5EEA0D25D7FBAAA4A33A04AFB243B328C0E1BD28D832BA754102FA20E1D02B2A3A8EB27D312ED69A4039164D3EA8B9749A1871D15090A650DF069C4D6839D61809A9C5D7B97A699A6EBF90E22115063D37D26C65D62DE1861CAF32 sk = C0407E41DDF48D333978B89BCF2DB01E4613425B456249E7B2DCA81E3F5F748D23C9D356A2209F6B2D60247B2E45C9808DE497F64F124603198231B2ECE738116B8E716830579B4747EA32CD93C1F2026FC0B0BF4A608977912A8E61B24ACDF60B2D9F89B54795782D82DCBA07E6874BA64CEBB73592354353B97A2D2AC634BD9EC0C8495DEA7C24027D0B65B0B3848C5EBC61455B0032838BBAD62098581BDB125DA6248433E5A60DBDE1CC65F6E8A8E19653E9070C66326146D0BD71CDAFF11FEDCA7E4A89A8E89C10A8D3D35CDA59675B8DD15610719B37C6AEC5E80848804B5CCDAB2A3382C77592A6AABC34F4FD06B7B69A2F0C60D063DFD1901E7378305BB3BED982F2C65D82559B95C57620A23A562D63E65F2C6C81F95C651D8856D646394998C3590CDDC55D126AA9F41AD69A941B008167F6DE68A23CE9FCA68EC8CBA4C05AEA971877D04C0FDE00205ED2C715762C4C523D5EEA0D25D7FBAAA4A33A04AFB243B328C0E1BD28D832BA754102FA20E1D02B2A3A8EB27D312ED69A4039164D3EA8B9749A1871D15090A650DF069C4D6839D61809A9C5D7B97A699A6EBF90E22115063D37D26C65D62DE1861CAF32 ct = 97896865CE6ADD775D4494D67021EBF50B7DB54E531382E6A0F295F07AF5C8BEDA125EE68313F75B91270E62BC5BE80178A0325D50324FCCD94D2F00BB550A297273EBB14F34670AA95C3CDEB7F9AF20326B6C37FBE4FAA5D06AB472A14BE13D24A5ECB9BC9C67CCCB69AA4BD93B93ABA96D479434B32852C3BCA49BF31367D6DE0E3F9928F2E170507BC82AE881205821945E122D9738C2425C50E8016B81EB19AA2C66847AFD5B56617E7E4B15BC34992143C6CC767AE4910B0BE7093344D982872F7168693DFC0642AB675AE7FE5F18D66A07285AE68CB4E74536B20B43A4810DF5F82437365C300D9806BC533A345FE9DC8C58505466F9EB210DE2F32A4C594F5ADF546ED2102DE1E06329AC5FF1E0886C243B8CDBE01A5EB89BA41992CA45D9724A2BE1CE89279EA07AE9CCFFC6CFF86D2C3B60966B4CF1211B8E92B2C42707DBE957292C77D5DDF96ECCF121DE4A119162F8416BE19B2F3C8D91CB78FED227B05B1531686773C2AEBEF2F9CF337AD43A1B2D1552BC3116AC8DA9448C33F234DA667D3C138DE343F0E06C09EA88257D ss = 51C06A9252A9A1E7FDAE296584C13112 count = 67 seed = 074AB1A37BA5A0403D8F68D26FB787BC2C90F5EF88F2A6D286C3E6B168ABD85D393D8225618608B8EEB301D26AF53BC0 pk = 2EF91EBDF5261EB92B2F470053DC48EB4563E5D40389FA27BE0586E1FA15D379446C42C9E79647588BFD4072C1EB2D90BC75C09B0DE7F2388502552AD7E43D7258EAA76380809D61E709F5BF278F075C2265E915D892CA7C74CBFC23DECAED089E6C652A5268F2FCE22A518E2A8495F14F645F630B73ACE37BC964AD63229ADC14339CDC0544703BDD5F206920011D1E72E5FC5028D1592906A7506B2CDDF4281A350C49FBF2F6DDC610EB9774E5FF32E2E394D2B00666F2EF1DC9D62E4AE7550B7F90795BF7FC318A404649CDF2D1D69BD8887FC04B5FBB7EF6AC2E47EBD7EEA4FD18576DEA28A6BF25B19E45B541181C06BBB760713C7873AA1D1FBAD06A415DFEF47C327365D3BC224B12534A889D93CF708567FCF2B23F334860587D9C79EBF5984217D78443712EDE9019862E48B6B852B823B972FFEC482998266488AE4CC1BED9973685C14CEA59BE35723DE7FCA95AE88C42EA3976875C817E2418180D6E6E21AC1F08F86D5666C5B12C3A04C6733FF3A98851DFA93B sk = 334382D39164D1989696A2FF77B25A28AF8BEAD9883B5365ABA5068AF837BE962F439F233593D193CE5E08F7D66EFB3389885927B89D25032EF91EBDF5261EB92B2F470053DC48EB4563E5D40389FA27BE0586E1FA15D379446C42C9E79647588BFD4072C1EB2D90BC75C09B0DE7F2388502552AD7E43D7258EAA76380809D61E709F5BF278F075C2265E915D892CA7C74CBFC23DECAED089E6C652A5268F2FCE22A518E2A8495F14F645F630B73ACE37BC964AD63229ADC14339CDC0544703BDD5F206920011D1E72E5FC5028D1592906A7506B2CDDF4281A350C49FBF2F6DDC610EB9774E5FF32E2E394D2B00666F2EF1DC9D62E4AE7550B7F90795BF7FC318A404649CDF2D1D69BD8887FC04B5FBB7EF6AC2E47EBD7EEA4FD18576DEA28A6BF25B19E45B541181C06BBB760713C7873AA1D1FBAD06A415DFEF47C327365D3BC224B12534A889D93CF708567FCF2B23F334860587D9C79EBF5984217D78443712EDE9019862E48B6B852B823B972FFEC482998266488AE4CC1BED9973685C14CEA59BE35723DE7FCA95AE88C42EA3976875C817E2418180D6E6E21AC1F08F86D5666C5B12C3A04C6733FF3A98851DFA93B ct = D09252E5A9F857F98190BEE372E55AA91D9E73E54DC356890DAE6FBBBB871FA9D53DEAFADE19D90ED6D3B9E5BEF7E78B606A7744E33DC6B48269C0B1B71F12F4CB9C820A28D834145014DEF9A1E5B497FC96D45EB6712F334B2A640FAC7C925D054A0DB99C91A44FB6DD44FABF4B4125546C874F36E0FFB9301D042B8E314312B61A9EDB2F7F72262E1147EAD48E68E2B13EFBAE89F43E42AF27E1348761A01F726E6496E946BF7270C8F9A3616AA8C13B6FC74FAEADA26F5B0D8EC70472D9FB033DBB519534392BF440D404E2FF3C9DF5E2E4E5935DA68D0B9C15376243780B9397C5A78FF193A99BB85539512450807B237D54E90627DD60FD3816E5F87E8894C4299279094BB4F274E0F425ECAC0564EBC7ABFDCCB7AAE9F7BB1BB4F385A13AAEBA839A5327C53204110A2B24A1F82575BE823A77887BC94C037A7A95742D56072FAD78825FB4DB760FC741A884C3A0E18DF1A447C11435E946A22AABBB1804940DD025CC4D06D85565BDC155EFA1DEEBAF2D400E011DD235A8C0079933500A7C9E7E1EDC0D582ADC676EA8C5CA77D452 ss = F7AF39468071B219E8EB76EB6CED97EB count = 68 seed = CC0C86CC0ABF86FA21899BE1953913C00E7C46E6B5F730C4E88B3C034012763981D7F14459D3081638080378348856EA pk = DA9F2EB2890FF8FAA53012E5FE3FDD8EA020482EC2B9AA51C0A47FE492EF6EC9499C0A7B94A8D250D3DCC89C4497167B7ADF29249AF72B9A79D7E180FE582402F2E7125ACB73AD623A9BB17CF72A937BE227134364DE051FC482A756E31632EDACE335859115074CBA8289331FE265B70B9CA57567FF1AF84AFDE8320E1FB00E9800DA0D939C64C8D97647055CCA7914E806E4F8A2199ADBE8B06CCB2E328271162652504DC175ACA71F0CEF6F2B43A9DA5C42B2EEB8D3748FFB8DD41DCC274E120AE56658E17C59A92F113F9AFD909C5666D547CC7DDCF25597799B1D9A33BA0877325D2DD347AD85BCCDE6D4E2CE9DE7CF6914957667C1B98EC12DE48CDFCFEE5AF16D5B7ABAA07085E362232C581D7122BABC9408C6E64731249C00C2DE00C966592D077D740565A11177A0ACC0BFB7821E932B8BA2C1445312C6AD889604D3602D43BBC4BB0405E7BE1956B6C43F487B0F0335420E137D8C6AFC8DC55BE65EA84756BB75CFFBA50C43CFF2D900F81E44F92DEFB1DB1E283D sk = 6995143E8EB8A6E93840F76EEC844F67D2B5F75B1839A5040F4DFF8E56F68440836A072412A30D851ACE2C7C6F02D60E7A8420001A63E606DA9F2EB2890FF8FAA53012E5FE3FDD8EA020482EC2B9AA51C0A47FE492EF6EC9499C0A7B94A8D250D3DCC89C4497167B7ADF29249AF72B9A79D7E180FE582402F2E7125ACB73AD623A9BB17CF72A937BE227134364DE051FC482A756E31632EDACE335859115074CBA8289331FE265B70B9CA57567FF1AF84AFDE8320E1FB00E9800DA0D939C64C8D97647055CCA7914E806E4F8A2199ADBE8B06CCB2E328271162652504DC175ACA71F0CEF6F2B43A9DA5C42B2EEB8D3748FFB8DD41DCC274E120AE56658E17C59A92F113F9AFD909C5666D547CC7DDCF25597799B1D9A33BA0877325D2DD347AD85BCCDE6D4E2CE9DE7CF6914957667C1B98EC12DE48CDFCFEE5AF16D5B7ABAA07085E362232C581D7122BABC9408C6E64731249C00C2DE00C966592D077D740565A11177A0ACC0BFB7821E932B8BA2C1445312C6AD889604D3602D43BBC4BB0405E7BE1956B6C43F487B0F0335420E137D8C6AFC8DC55BE65EA84756BB75CFFBA50C43CFF2D900F81E44F92DEFB1DB1E283D ct = 01775494EC485C77F94642C265BA581BED2697A183EBA6314F640EB220814067A26C0172A7B12695960731D76F68CFE1D29DEF66D7B49F541E8B1813BE93233DCA84999925B0B20B6BB3872B3DDCC3322DC3AF9AD9CE594DA5F47D2B2295091EA1AFC66DD414D91D53BEF899AFC91C10546CDBC2DDD6AA4A4039FA0396099A2094099C78A410E0830382379BA0C54E2DED11C55E12D813C5678014909973A807B7803CDF3B385B0AB412AB6B19C9A7D342B99FF3262596B2A2E7F9BF0AE69F01EB6AFF39CD52C27F87891B661309663CCCAC6287BA575D2B1E90EF3E0A3353704589C62539F783EBC16A405291A91DB52C22E5E8B5CB5A9CD1016713DD7B1E97A864DBDE036BC19E9E1EEB8D452E2D2E6611FCCBB5563DDFC1F7F443D2668ABBD2A6451EB60BF11D5CCB265163B8F6EA132D3CE13D64C0FCE7BF299BDE91ACCAEB63E125118CA30F0C87B331662CD016B131FBF20EC62A8B78DD6F7C4028650E16A83CF7B2D9846ECB1A8D01687CC8C156595F436FAF76C7AE0D73605BA3B6616E13FA6352808BD767BE9F6741345D4083E7 ss = 795C1639B810FAB967C5F7F15CD7EBF3 count = 69 seed = 6D5A7CC326ECF3983C4E7683F45263A37F692F3BCD2D920E1FD9584350119E74F9A3F905F70D3E20318C1413DE2A0DEA pk = 002A7F962B812789ADA4705FE742572BC322707D916465EC0ECF52CE90DBF4C0556AD81666CB42882D39068F04D94BD3A065C3DDAA2A0953B99FC34B6F543B5BBAB07F1E2430BB7079B6136D9F438E41150C3DF99E303A9288DE9B2A7F1002885EE60D8274D7ED1089AACB3F5058861F690C386931F2D7EFB5181EA0E710900F785260DE3810AC24B8F80A42871C87BB8C4C0E52D63112E1D82C65879E8E6529AB7671C763715F304174643301F640BFC816CC9C37E4087FFF8905B93BC47C300DED52C678C110B594FFF3FFC0D02A0BA17016F868942D38E718B0DDF221141202F92AAB40B7605B90A94BFADACB9F31646546E23AA0B55BE40B901C0F782CFAB4E6B41EC13932109CC5AE781A1EFA62BAB10E742E7E512B8BB5181024F9C62AF2F9500F058CFBCD689A35822BA7DAC6CB61589FF123004305382F81E253B45A4ED3DEE72784DC8673EB0E85BEB00B24ACB68396EA2686D035782AC912DBB4C16620103121B288FF6903B2EFD8630A5EEDD98692B102F6015F36 sk = 995EFF7E0D195C6D0533F3DC194D47E60F9AD14696144CDEB28F7E7A15A005F92400CE33DB073D49B53871594A88FC45E0F94207B5F0F20C002A7F962B812789ADA4705FE742572BC322707D916465EC0ECF52CE90DBF4C0556AD81666CB42882D39068F04D94BD3A065C3DDAA2A0953B99FC34B6F543B5BBAB07F1E2430BB7079B6136D9F438E41150C3DF99E303A9288DE9B2A7F1002885EE60D8274D7ED1089AACB3F5058861F690C386931F2D7EFB5181EA0E710900F785260DE3810AC24B8F80A42871C87BB8C4C0E52D63112E1D82C65879E8E6529AB7671C763715F304174643301F640BFC816CC9C37E4087FFF8905B93BC47C300DED52C678C110B594FFF3FFC0D02A0BA17016F868942D38E718B0DDF221141202F92AAB40B7605B90A94BFADACB9F31646546E23AA0B55BE40B901C0F782CFAB4E6B41EC13932109CC5AE781A1EFA62BAB10E742E7E512B8BB5181024F9C62AF2F9500F058CFBCD689A35822BA7DAC6CB61589FF123004305382F81E253B45A4ED3DEE72784DC8673EB0E85BEB00B24ACB68396EA2686D035782AC912DBB4C16620103121B288FF6903B2EFD8630A5EEDD98692B102F6015F36 ct = 3A79A90DE415D008A85D8B1555E0E5BC944CF2AC384D1779533E4AAC61969F8FA4300CB60AAF606FB692698C220995D7582666D00369D4855B5560C328AF24074D10A8E95743EBD8084380FFDD12A1E7C6233A331D053534C942991694BDEB581216A42F15155972792369A55E56F9C41EC6C318BD9E91BBDB7ACA3D4D3074C04CE2DA22B39270EB0E1F3140C2ABA6AD06F38A2F893357F431880A1F68C8241C8CF3AF0E0A4DA6DD198B30A8B30DAD26D12B118F7AFA8CD4276D65C21223BD96FD81F38E8E4F56CBB36ED6F957558EC7B50161A05C3A53FE66E67E5A00220C49DB191081DF1F93368A12A1F16C9C91604A7A0FC5FB980035F711E1289EA4406291A8E772BCB26351561FC5AA127862BEC2710D29C65BFA9672124F6E46D2E59CC7BA7206544B61F11926392350BE5187552B7B2287A95908B939254880A152F88165C75BCCE5BE5D2DBFDA7B80DF1B5E88EB23F993D521413F3C20C9D19842E1F23ED0D84EE7CA240398FABE0C885A61E1F4F232A51726A65F1F766CBD9A43D994F904311A98A0128969FAD16A3DB0634CD0 ss = 1BD1F7208EAC7A8D5E17FE75A98CD1FC count = 70 seed = F68FC0314DEA88F66AFAA76E6C9B6804B13D4876924410D1F526FAC59A62E26C560B125B1D0F8B461F1FC2E351EFFB4F pk = 8F597E89C13C38AB2F3321F6CF5956813192BCE0F64A7275650D6333FBDE04DCB412E958F514266A48D71598B66B4F5491E2396689809E57FD3FA1002818199DB0D3100668121004486FC8C68201A44033FAE9B9DC342A798904BD831A4E92E633E61DEF7FBA08FD888EFE77EC94B95AEA9FE182DE6A352957769F4854178CDE6A05526EB236D19A424FDF12017C4AC9F75BC7E47BC6DEB8EEC98817ED85948B352686F695438574229350F37A0CF73FDE1F31B3D991239B37D51DC922E927B1437C68079EA998555C51C7902D15B74E6B7B0F2CFA87B26667C9AD273285473C76D407A536CB24136CCB45A040B6BC98C5B7AA9A7948DE47D86BF010664A1DE26205A1E9FE44BF527F4162CD0F1DC42F820A811EA2223B612B78CEC9F2131F0D49CE3A53143F0384C4F19B3EBB9093E393CA99018AD7544797130EF2F0A7CB8E5A2C1AE7F1F39B66E2AF0A4BF714009C5C4774EB0098AA65F86413D0AE44A462B9D83398F0C3E9198B02EF039836B3B15A92CBC8312F61DAB529 sk = 3E809EC8DD0FEC0D911A4E3FAC20F70FBB128C5DE94DC718D8128601C28B1DEF8D393A0DB283229F7C7383152A814E7CEFE8EF9D9768C4038F597E89C13C38AB2F3321F6CF5956813192BCE0F64A7275650D6333FBDE04DCB412E958F514266A48D71598B66B4F5491E2396689809E57FD3FA1002818199DB0D3100668121004486FC8C68201A44033FAE9B9DC342A798904BD831A4E92E633E61DEF7FBA08FD888EFE77EC94B95AEA9FE182DE6A352957769F4854178CDE6A05526EB236D19A424FDF12017C4AC9F75BC7E47BC6DEB8EEC98817ED85948B352686F695438574229350F37A0CF73FDE1F31B3D991239B37D51DC922E927B1437C68079EA998555C51C7902D15B74E6B7B0F2CFA87B26667C9AD273285473C76D407A536CB24136CCB45A040B6BC98C5B7AA9A7948DE47D86BF010664A1DE26205A1E9FE44BF527F4162CD0F1DC42F820A811EA2223B612B78CEC9F2131F0D49CE3A53143F0384C4F19B3EBB9093E393CA99018AD7544797130EF2F0A7CB8E5A2C1AE7F1F39B66E2AF0A4BF714009C5C4774EB0098AA65F86413D0AE44A462B9D83398F0C3E9198B02EF039836B3B15A92CBC8312F61DAB529 ct = 4811CBB081422C8875768D4247563872C3E04AFEDA462BD11E05EEAC5EBFDA4B9B60EF30849F552D6EC5D4CB86AA6E096046BFBD538E613E80F0A4F2BAFC250FC5A08F1D55DF9C64BB744CD6078DCFDE766B0B8E615EFE40B41EC1709E867F25FCAA1D0E3C68E8D11678ACEBDCF3966AE2EE57A495C1752DB6E924356F32C7984BF5D465A7A456594EB8DCF51DA32CFD3264FB69310ABD4798813C3DFF8521346F7D00038197AA19F17441CA943D902C9108F17042DE1755EE933CEC38479EA58ED69D266E49FC5CDAD3494FE875B3596E23E73195CEFDFB87E9D6E7E8E8751A693734BEE91CA599297CD1B711B3BC733ADA13AF3E9BE51328BF453E7843F56D113AE50F74E78A565800F3B5537390CC860893CAF27EAB97825B36E4376576BFAEB3831F54BFE8C404BDCEE69CF895936720754417B403F363121E4D16F481CDFF128191E3748E1ED817C92F7E7842C7E291F145E398B39655C942353F49689EE569CDC47A234E326B8E8E58EF95B41B7BBCFD957DF33E5F983AB7DFC5695B6664BF0AC9B5AE2F2DE93FCD7C62A94898E40D ss = 0EE00DC6B4C3F9A5E6A8CB5E450F4C8C count = 71 seed = A229218B0D51F58D915DF549901548FB0722F352C7470900E7E4D8399205764A319BBDDBD06C00E8C5932722EE5A404D pk = 4E2442EAAD94F4C03C29C95D54B2F0FBFBEBB53839F756D4B63EF9A975B457F2C9E4B095254D8B7DC0AB6D5F27FAEE6FC499A085721BE47C4DD20D93BA30343B6241890E84AB706C9D7BB78CD51F72B10E48BF08975EA53B7B539AE22EB171004FE57CA44E7C46899041C5E6A0C2E89172ACAAD919E34125285DDC31BD0DEBBE3199FFD6F4EC817F9CDFA6F9F60CF510B7270287F72513AD7179359072ED317A35BD42AF5477D5F94159D19A14AA67F910616C7CD3DB226306ADC42501A2F1BB190C9C47D1657722C31C6F1773F8E8CF9A76D11615841C367CDEF564388F400872D2E8F0AEC77813F69593D722A7C34E68DE4E956C1FDCB5B855A4180C0ACBAA82144B9E9F952B02A034AD4BC201FF9C99B4B5CE5E749839DA803CDF7FEA6D584D075DAABE5E19E809B57EFA7BE56D4C5B657563D5047F1086841F1794F753D6906C5306D08BC791B107DAAA1B22926886EAEEEAE2359B501112A702FB165476E6BCFF6295D80338D6427C0D29BC667884692FEA827D7C243D33 sk = DBF1C465FFF3D9F783BD9EE61A573715E45691147B890443B6D75EAC6C76CED1B0A025B40A55440712AD8424672E761E9BC400D63812000F4E2442EAAD94F4C03C29C95D54B2F0FBFBEBB53839F756D4B63EF9A975B457F2C9E4B095254D8B7DC0AB6D5F27FAEE6FC499A085721BE47C4DD20D93BA30343B6241890E84AB706C9D7BB78CD51F72B10E48BF08975EA53B7B539AE22EB171004FE57CA44E7C46899041C5E6A0C2E89172ACAAD919E34125285DDC31BD0DEBBE3199FFD6F4EC817F9CDFA6F9F60CF510B7270287F72513AD7179359072ED317A35BD42AF5477D5F94159D19A14AA67F910616C7CD3DB226306ADC42501A2F1BB190C9C47D1657722C31C6F1773F8E8CF9A76D11615841C367CDEF564388F400872D2E8F0AEC77813F69593D722A7C34E68DE4E956C1FDCB5B855A4180C0ACBAA82144B9E9F952B02A034AD4BC201FF9C99B4B5CE5E749839DA803CDF7FEA6D584D075DAABE5E19E809B57EFA7BE56D4C5B657563D5047F1086841F1794F753D6906C5306D08BC791B107DAAA1B22926886EAEEEAE2359B501112A702FB165476E6BCFF6295D80338D6427C0D29BC667884692FEA827D7C243D33 ct = 3A7E02DAF340F52C75549EBC9DD5C254C4C951EFE22E9E9BFD1D7EEFC7699C8BE83553DD804B38159A7A4B50A73AE026456760F60EDD52B292BAA4B6FC7E1548C083EBBD185871BD06424577C4B9866624787E13EB20BE494F2D75FD309398391CB53BBCB4178E55F71A05D610E20EF024ADDB3B023BA87191B5AAFBD41CB2CC9BF03EEA6B1D1AD6C1521768C78A75DE8A2A4D9A24390ADBD70F47B6158DAB9D83E089D6C85C3D010EAF3507348B143DC7288E6CFFC9C6C56435F2EA0870F25C4F660A73B22263AEC9C1C417760E1F68572714329D2C48A0741183C0539FBD450474154353729F48DEBAEF03C71DDE56DD1DE1CA4AD8212C6E916935A77FE23A6FA01391959CE44289AD680A97C206A40D0EF9D1E2397C6DB12E9995C579CFA7359FA7967465543CA075A68C3F137FD964A4E2CD999411C735B02E2318EBA08FEE58183E6D18566FF3569AE30879E74354D846DDB0BD519BDAA19D52B529288DCBB623B1D33DACFD5FE22D05B418196132CB14BF0A24FD0BE010FEC25B1A299E2D7CB83191D9B6FAB4170B26DE6C02726CE2 ss = 76FCEFC491ED89034E8A6956A3F8D9AD count = 72 seed = 6960F21C7350DCF41B4770C551DC8692D8BA2C0B6E162C589166FF22E7A1AC0F94C2F48504A5F7EB0DA094DF427BC98A pk = D0AE536B7DA777D322FE70CFF08D604F6129ABDD3190FB6124553D7331C645EE8E76E345032A41A1F612A23CD5049024AD6B342A75A09884BC430828C61A2ADAA81B5FEAE4D6D969A56F01B2C81F12EFD152CEE4E8B332AA5AACA18DA195D980D4FA64CBA24CF86916D006EAF12B8100559855A58F13E195F09526C264323A38169E6ADDBD5168E619ADFC498F65D313AF684B087A868B7E53E37ED58FAA0B84D85876BE1AE9176D27B003E82BE3D9C407384FF9E40E4B4641721DCE290D273D2826F2365ECCB71FB9C5200262AB014A03DDFB854B265D13A145DCE6039E51763355F14D8FB2E8AF489B0191AE3ED263E5A8FE4EB89D1A958792BE39712E6043B92671087F4C56398B7C805498EE663F02DD2607A9CE72E104BE33C4426E2C499EA00A676D3F63A14D3E02C5E386D7F1B0776AD1CC9EC9D4B8D619483229545FA18B999F7AD9DA8C0785B524C0E693804FF6D513AC7005CC4C3106597F3FD4BEEE6468F7E6D8697C58B07A0262E158EE9EEDFFBF6F63D07A7435 sk = 1F7CFD2B70863154E8A69D1758532E86C20CFC763D67C758273B38BDDC18488024EC90E62A4110129A42A16D2A93C45439888E7600860406D0AE536B7DA777D322FE70CFF08D604F6129ABDD3190FB6124553D7331C645EE8E76E345032A41A1F612A23CD5049024AD6B342A75A09884BC430828C61A2ADAA81B5FEAE4D6D969A56F01B2C81F12EFD152CEE4E8B332AA5AACA18DA195D980D4FA64CBA24CF86916D006EAF12B8100559855A58F13E195F09526C264323A38169E6ADDBD5168E619ADFC498F65D313AF684B087A868B7E53E37ED58FAA0B84D85876BE1AE9176D27B003E82BE3D9C407384FF9E40E4B4641721DCE290D273D2826F2365ECCB71FB9C5200262AB014A03DDFB854B265D13A145DCE6039E51763355F14D8FB2E8AF489B0191AE3ED263E5A8FE4EB89D1A958792BE39712E6043B92671087F4C56398B7C805498EE663F02DD2607A9CE72E104BE33C4426E2C499EA00A676D3F63A14D3E02C5E386D7F1B0776AD1CC9EC9D4B8D619483229545FA18B999F7AD9DA8C0785B524C0E693804FF6D513AC7005CC4C3106597F3FD4BEEE6468F7E6D8697C58B07A0262E158EE9EEDFFBF6F63D07A7435 ct = 18F16C348230CB186A40FBD5035C57C305DA54D940F3C35E5775E38E98FA54C685BC2B9687308BEB3B62F9A8BAD52AC07525F772EBA731FC6CF2F8F88F32098A1245A8E37BA152E6FBB27D580BB7127A98BA43F509ED7B313FEE686BA36DBE58F8C0922E72AC06E072486FC2336DA8FBA5DFA430F8C44F4B51C115A67838D240D39562575A9C60CD8F0394F9FED1D2479CD1BF0FE27F4CB418CF723D29C3CF9DD4013DF8FC4C327E9492D729AF1300BD4FE0A5741817B976C46308B4033A213C9DCC451D544133DB3DDBD331D60D9B9D791092FA5AD6CA50FF6F38EB9F8987FA7C07C1C98E96B6D23F2E53D4DE0E6DA0978F63E9DC6AF1C107D92530BF749359E87F112E7BA0AB9E69317737D7E7DEA63C785213FFFF2B0542B9DDDB76019D9CECFFF0EC8735D25CDCDF7D337C75AAC550BD80F181F088DD0D471DD250D398BB2CAC98F9BC67DB1C5623BD56AECB0346F6A9E338D47505518FC12FEF594397226CAAC3A874963260B01ADE657DB2CAFD0DFC37268D2AD0536928CD6BF63C5E5F3378C4090FE3477D1056766FE7C96255ECB0 ss = ECEC8EBB1FF787CCB3D3CD06618A3ADB count = 73 seed = 53DF46012CAD4A745B7A3C06E18CA95E0B839FD8161E3025749A0887549EB0ED6A44EEEA08BD6060D6509DBF7E9DC864 pk = 856A5DB00361F60DCEB644A5E578DB17565600190421B3A7700FC3578D3BE5C362D343185E72799B14A085C7C56C8A52B324ACB62141EB842A305DD0FCF31040D3DBF058DDEB7D3D89A90A0CAF69FF9D456DB0542816538F0FB24FC50F09719AD456B623E79AFD871FF9602F4BD3AC89E0C0542BD817875AE70477657F384DA137E30FBB7DFEBF0F9C9019F0B18F86A1255ABCDB5331549BD3FC24012428BBA76AD9D121B3884AAF95E79DD927E8D73A8896C496CC7F8CD6267A0A3A2163DACD9DFB72B9597E3A0721CBE10786D6CBF09A9C4D19E3E1EAB4DFCE09EA77129AB3FB480F623F09C4E5810D70A89E47E0BE2A6772287269F5E13DF0EC29427CF801F9CEA60157935F7343F3BF662995D726143008511341B5EAE5697A7E41E522B7218B1C1EF6A1912408422F32F5D1103410E60C3FE819E3E6FE8B3C034A7C24682F48BF588E92E957D9CD551C78F1F6EE52D3DA73A251C558879D638EFB8FB522112E1DFA854296E62E84F230A0BEADB884670C57F2462C52D414 sk = 3A19577908EFD37697B8EDC7FDAF47D1BD3AD01A1B77FAF7A3729672816F3EBA84C9638A79676EEAC0F22C8A48E0C5D50A26FF0844C66B09856A5DB00361F60DCEB644A5E578DB17565600190421B3A7700FC3578D3BE5C362D343185E72799B14A085C7C56C8A52B324ACB62141EB842A305DD0FCF31040D3DBF058DDEB7D3D89A90A0CAF69FF9D456DB0542816538F0FB24FC50F09719AD456B623E79AFD871FF9602F4BD3AC89E0C0542BD817875AE70477657F384DA137E30FBB7DFEBF0F9C9019F0B18F86A1255ABCDB5331549BD3FC24012428BBA76AD9D121B3884AAF95E79DD927E8D73A8896C496CC7F8CD6267A0A3A2163DACD9DFB72B9597E3A0721CBE10786D6CBF09A9C4D19E3E1EAB4DFCE09EA77129AB3FB480F623F09C4E5810D70A89E47E0BE2A6772287269F5E13DF0EC29427CF801F9CEA60157935F7343F3BF662995D726143008511341B5EAE5697A7E41E522B7218B1C1EF6A1912408422F32F5D1103410E60C3FE819E3E6FE8B3C034A7C24682F48BF588E92E957D9CD551C78F1F6EE52D3DA73A251C558879D638EFB8FB522112E1DFA854296E62E84F230A0BEADB884670C57F2462C52D414 ct = A2A47D16BE215576F1470608A443E615C8BFCE5E7F9ED5B249D6F573A2DBB0FDF843EA8C9662E5420B2C896AC83D9C2D0835416E25792CABBFD9A699A2150C132910B446ACBDEE88F3B746CEBB97DEA9B98E349AC6773DDEC949BBCFDE3701680B958D70024426F63D9AC3A831264E5CF96808AFC5D852208DDD10F6F93628F5B4157BD876452F60108803E6D19F489C514DC88E997CAFBD2811877D8D828E153327E818377FF0E068D7E88DDD0B6F30877EFBCD8F4B8BE15899B6D62620C7D6EF58FBE58325DF7CCD9A8D5417EF85406ED2B02A046A7B6A4C6262E318CC322BC061EB8817430CD55366FD3DE7FCFC0C356C8B0E41E41E100E5CBD3BC430CA100DAAE05B394951DA156DE25436867D5F6A09B99B94C1DB7A60996163FFC80143B00DA9805D962E05218DEB5D7C548AACABFF4C24605C1968E5A53ACDE8028D42D01CB2C8CF9FC90FCCDCF0C173340284166B32107CEAA5990E4F29BB975BD671DF5F044A7244C5E9B36819317D23F6E6A99F3A7617250EF28514B3A56FA4A80F8AE6AAA5FD88F28C7A30410593B916834373 ss = 7229B4C1AA0A7B970123AB36B190191C count = 74 seed = DEB963F8B1D8FBDF499D564BA8D2D47915BB402DA02F17031B37B4039A842AFB9B7E48F37200605992BD2429427A7A4E pk = 92ACCC567671EE5FD8809FF0F2FAEF216C9928598992C7E96D47EB30D7C5DBCE2A2C4B8BC46B3FC30E8A960221C574B9244F3E6B27213B0508F16A7365890661E67F4B9C1F3934B87F943E8E8F350794CF2969C2A837C06FF03242EE7746ECA4425D5359B3B5641B0E269201FCD2A8758B2D8E3A58B285952F52B39DF80A73C63F6C31B02C464F49345873A35F25DFF34D62CC39A1667E0DAC951D1F169E2291B4180ACF5B7C793F7BB8E38DCB3A13385204C2CCC84BE1726B5751770E8EEEE365DC46561D70960A093EAF4817672DEA8D6B1CAF7A05B9C69C0EADE21AF50939AD74CAD7AC20D892F688A3736764888003AB84E55BFC0F840331103E960BE3A5220DB5DE37357ADB7DCCA91802C74DDEDAACDA07259B8DA14B0E2C4965DF9F8A99B92234C0F58F5D2CFCAC08309FC03A39B9EFA944C0030BF8CB38B6618147E950162129387826181B5A40E5526DB7C9D15839A1C39CA1A5111EC00B9E836A226783D55861FB9F4EA96B8A3C25FDF064DAD0A2973D15BF431538 sk = AE0F65E29F38804A6759F70F4D01E2AAFF7FE1C91EBC4F89E03FF73E02A217659F53D8C47556BF3D8C94040F630D63605E2D0F923579370C92ACCC567671EE5FD8809FF0F2FAEF216C9928598992C7E96D47EB30D7C5DBCE2A2C4B8BC46B3FC30E8A960221C574B9244F3E6B27213B0508F16A7365890661E67F4B9C1F3934B87F943E8E8F350794CF2969C2A837C06FF03242EE7746ECA4425D5359B3B5641B0E269201FCD2A8758B2D8E3A58B285952F52B39DF80A73C63F6C31B02C464F49345873A35F25DFF34D62CC39A1667E0DAC951D1F169E2291B4180ACF5B7C793F7BB8E38DCB3A13385204C2CCC84BE1726B5751770E8EEEE365DC46561D70960A093EAF4817672DEA8D6B1CAF7A05B9C69C0EADE21AF50939AD74CAD7AC20D892F688A3736764888003AB84E55BFC0F840331103E960BE3A5220DB5DE37357ADB7DCCA91802C74DDEDAACDA07259B8DA14B0E2C4965DF9F8A99B92234C0F58F5D2CFCAC08309FC03A39B9EFA944C0030BF8CB38B6618147E950162129387826181B5A40E5526DB7C9D15839A1C39CA1A5111EC00B9E836A226783D55861FB9F4EA96B8A3C25FDF064DAD0A2973D15BF431538 ct = A4AF2C2FB7AD4C82B5B60E61B2B91F58C33F6AE78D46A0A5A1C8C78742AA41A2C82F85B20E453DD10B48126817AC73349DF685FBBBBE86EF5AB5BF2D201C2F13D9BC525CA033F552AAA051FCE249EC07085C25DCC39F77FA26D44DA98E169D9C998E85C7D70B3AFE33EA55B5A8209F2FE6669C9E15CAE92DBF9A86BF04175AE407EAD46801EF10A024B8920ABD24BD5BE62CBB79A3FCB6485B7CC169F8EED49960EA0F58DE3E4AE6794E877AA106FEE70BB204A4B69818B25FD39A3D3F7CC8D2249E35C90183D5DBE67838FFE518FE3250C929BEF5B16BB0BE6F591E97AA953DAD4E03801AACBD2BA3351D7823332E5818B846F7C2A2D94741A2F73ED7A588AA63E1FC33D70F1798BE627F0D496219EB2C08840FB7056E363D88D8E9B3C17DC604D0EED673E6945569F6AF7931A63F545541A5262FDA2808336919C4E77915C3F5A2EABA866A61E8EA6ECD22256CB413EE5BD423FFC79EFC9378C7EEB659009459E4B9E3120126B6A8F16EC62AF7B706E4DBD369E298A0BE532FFE046E29B3F85C35D80E5B1A494711E5BB39CA1C0737D58B ss = 407DE44BEE5F3EC9A7B60A4306A3763C count = 75 seed = 8E2995F1B3E43853B18916BB1212ACEB05898E2B177A87ABEB928AD7184E59695C56B2CCCF5DB80853C28A525E327D13 pk = FF02B3C5C69A3457FB719185EF965C04DE3C8DB013B4AFA2D50FF0972EB022F4A749B43BD41D08C6A17A164B78D6AE1DE196BBEA124F560E139ABFEB647801484114ED5EAB7D961FE55A2DF68DACB951681C38938823FD1B95BCDF6FF7E57EB226A83CA25744D84B069C8EC8F1AA4EE9611D988AD2A5632B52C2706EC1147E5CFF24EBB838C74E0AD1CFBCC71C39247E0C4C3AA583B4143F7CBADDF16928B35195D58EED5DD647BE94C6A9DDFADA7509C4C10396A7210E930F734FE5122AA9649D864DFF1D2520E2850ED8DAAEFEBCF43E1A2624C5CC6796F5D2AACED2757876FA3EFF482348E70CD7E6027C3578B3A360C06965ADE2C27294721F3B9DAC3F32C8318E543951E247009F07AC4B4943D9C0253978DEFA640C55C044070953C098E5C9EE4A64E56B0C78BB10EDA4613B615519C4AC9DAE7D478BA50CC4F173CE42F8D2EDE62D2C49B0E4DBCD036DB5CF878627B9502FF8A0A175638AF34260CCC801E25A74E6C9FADC67FDAF97CE4408C581DB59CD890F4634E337 sk = 6084A235F79DD093EF6D185B54E69DF33DACEE73A9BF2F379F684FB055ECE19459EB464E91E126A7A6E3ED11CCEE0046DA234D964C985100FF02B3C5C69A3457FB719185EF965C04DE3C8DB013B4AFA2D50FF0972EB022F4A749B43BD41D08C6A17A164B78D6AE1DE196BBEA124F560E139ABFEB647801484114ED5EAB7D961FE55A2DF68DACB951681C38938823FD1B95BCDF6FF7E57EB226A83CA25744D84B069C8EC8F1AA4EE9611D988AD2A5632B52C2706EC1147E5CFF24EBB838C74E0AD1CFBCC71C39247E0C4C3AA583B4143F7CBADDF16928B35195D58EED5DD647BE94C6A9DDFADA7509C4C10396A7210E930F734FE5122AA9649D864DFF1D2520E2850ED8DAAEFEBCF43E1A2624C5CC6796F5D2AACED2757876FA3EFF482348E70CD7E6027C3578B3A360C06965ADE2C27294721F3B9DAC3F32C8318E543951E247009F07AC4B4943D9C0253978DEFA640C55C044070953C098E5C9EE4A64E56B0C78BB10EDA4613B615519C4AC9DAE7D478BA50CC4F173CE42F8D2EDE62D2C49B0E4DBCD036DB5CF878627B9502FF8A0A175638AF34260CCC801E25A74E6C9FADC67FDAF97CE4408C581DB59CD890F4634E337 ct = 9AA1680EA9AAE087F6DF3196CB083FE3F462E560F1FBF9EFC708E8094A9CEFA627427AEBB99DE558416FA1A177DDA7E83713A325151F56C64DF41CDD485F050187CD7CB248887CC8F3C21F34EBBCD229852DAF31080365E88809B05ECFBB347EB814FA5D8311B99BC0000FD113E95BB99395CB473AFA937AA4FB135FD004AAE6ABF22AF7126200760C5084E97F1437BDE7BBF46651882EF1B34453A4E461DD7C37A726881C4C9C750BD1F749C2E317AF3FC171B6BC3C4E379035CB6E0BABA39E687ADECF28C2FC6D1396488EABFFEA1F4DA9F90CA21475D4ED599A00F3C6D5B32D844CF5D50724F9584EC20E2972D6A6168DA648CB21A0FE9236A0397B66411121A08D5F7341A035B52EE10F57A379F329993B61CBA5C306728B9FC8A047FCB7B2A9E8CF6CBDFDF240DD63AF861ACABA60AB86B615647DAFDE04277AEE2BF29FFCAF38FFB9344F82253EFEF2220115AF4BE4A20F2F4BD0D519CA80963BF17AE7FC840E2D80F8C4B8673D2B75B6C7150135DD7B6433D6F0474120F29E8CC3DA33AE84A296D6E577E7E63E4BCC07C952DF0439 ss = 2881428F09AA4288D15C7AE62575673D count = 76 seed = 9218943C51FD2DE47E509AAC67EFF176795102F37D7A2017E3AFD768FCDA7877AF38739B00FCDF227C2FD62EB635942C pk = B1977F87929DF034286F716088AEC299A479997BF56501E99778B214666FC1F8715E349AF17F9359349BC6A5391DB247054E2CFAD482607AFEB5364CE82C2341AF4258A4E19DCABD36542F9F113C75A5ECB3B2CB48BFF4E863B00BB676D6027ED417782617E0F5A6B089F29833953F6373D140E42905AC2EEAD0FAF9D0350F757F74B735EF57CE74764CCA2DD3C8DE894381ED568CCE84EB50500FAFE242FB9FD22B7ADEB0E1F1BEF547F5D68F314BB4742516D1AE528A8F454CCF4D3E59136EED77AB2544E80C81643353A74A85A6EF13236164E590C8B634BAFB67CF6A5E3D023BD9B506240B71DFFC972646DFC374D91B29CD140787CACF11F13FB603E7733DAFF51B586AB52941B5136A983FC696C13F92FD71A59E284CA3ED434F7F821FCFB27CBADDB439AA03FA2726FE40EBFF312C296174048653DE6335CE777AB5B34E3ADC9C0438E4BEEC423672757B8EA60232C0D9A406C7B7F8CC124D6C1001C9397DEC07EE3DBF647FD5562B642A21BC1B7259FBF943ACE46134 sk = ACD1C0217FAD5CAA4235544DD9DE153AB1880CCF4C76F16FF03A8ABB0A5010F400AE5722A75BDF5A2F6D5B546B34D73857CB1BFC7E587A07B1977F87929DF034286F716088AEC299A479997BF56501E99778B214666FC1F8715E349AF17F9359349BC6A5391DB247054E2CFAD482607AFEB5364CE82C2341AF4258A4E19DCABD36542F9F113C75A5ECB3B2CB48BFF4E863B00BB676D6027ED417782617E0F5A6B089F29833953F6373D140E42905AC2EEAD0FAF9D0350F757F74B735EF57CE74764CCA2DD3C8DE894381ED568CCE84EB50500FAFE242FB9FD22B7ADEB0E1F1BEF547F5D68F314BB4742516D1AE528A8F454CCF4D3E59136EED77AB2544E80C81643353A74A85A6EF13236164E590C8B634BAFB67CF6A5E3D023BD9B506240B71DFFC972646DFC374D91B29CD140787CACF11F13FB603E7733DAFF51B586AB52941B5136A983FC696C13F92FD71A59E284CA3ED434F7F821FCFB27CBADDB439AA03FA2726FE40EBFF312C296174048653DE6335CE777AB5B34E3ADC9C0438E4BEEC423672757B8EA60232C0D9A406C7B7F8CC124D6C1001C9397DEC07EE3DBF647FD5562B642A21BC1B7259FBF943ACE46134 ct = AE72316836860FFB8CF7CE76BA799D1DDA61253E361203B00F9A870FAF3CE3D71E711350474A218A851A3B9D3ADB673B2C2C9770FE5B16FCB8BABFD7CBAA2D1D406D449D03B834B8AA495886C1CA0AF168658AB649ABDE2A3B64FE9C64FD8F0D53F3A1A0C95F893B9DB915B5B2B1F7E5EEB794F5B62097A11045569CBA167B2DC1A948805924B131559D3139A2B741DBB7BF587515E6B51FAA90F0F012A411136A8B8988E2709EDB2D31DAE12CCA3E74D6C97906ABF32DDD4C8466710415B1895EEDC2720AC865E7A5B6ACB136EA784041865A817A4B8540153294045E96F62ABA55A89E9576EF7AB1B4AB5FCFF64F9161BF59952BED10AAAC8F8D111497706038EFAC711FB9F6917B66CD215684270414440A709EF39C47460815E22FC30D1E4A940A9A3403D3713F19D02A2EAA5A3EC39452F029D372BD8CCA1991108239C1C9B3C8841078B40D0D738280DF8D106A9D0D3411F7CBA6B8C95F9E54394D08A43C874AF8BC64AE915C5001F27EC7599A637D61CA24B4301891048D55487C04F85722F0C8662EEB621D781C9A7992D20FEFA6 ss = DAFF69A6D052736A29F7F699C38D75F8 count = 77 seed = 542E20078ADD5296050AF150360F057F6B9AB3BA835589DD56987DE805F900B906505B5390A0D86CBA28038992DFC59A pk = D7E54D1530021849BC2C79A18C4591C1B4D2A83C3537D0DF3E38EC43F625059FE7F0C458884D12BFE55AFC1C38DF88A1EB8E74941BCFE5080B11936A67C52CC62D66C5BD2F53AD1DF2B16132A888EA3C631D7EA0FAE26AAD70E6659E037376365AE13C032845B287E06B537ED9E3550726283A3EC7EC8010919935EFDC18E1C455868869D89D2B72A54ACC840ABC7AFBB39E91BF071E86582AFBC07BEFDE60DD36D7737B8C2F84B7D496779DD12A547FD14D98EDD6EB7AD0E88FC08E3102AFB41AC4D74F8766AA6475B6723FEE42E51830FC47F7090ED1ADDF1D35F94F976EC09181E36E81C7D1DD2F26D35D26633CCAC4368B33E18CE69D42B9121127E5E23D4416A2F1BE0325BB5A32E914FCD1437BC35D0D9D99873481BB25D3994B1208850218D8E21709D44A3591F7E2DD7B55E9628F0898B890E42C2A783DFEA67C4747DC83BC0F485A5E4841F3E26C2A39B07B2D1939A265AED5F74E010249668DF38A6ACFF03EA8556003F0F1E7B568D9CD5D0FAA2190FEB55C098E3C sk = 241191401A63AFA750F05662E354DDDBC683C776CE3222BEA59B3BD23B49A95BC1FAD20070FEC930B6060BD827D742B077092E422268E10DD7E54D1530021849BC2C79A18C4591C1B4D2A83C3537D0DF3E38EC43F625059FE7F0C458884D12BFE55AFC1C38DF88A1EB8E74941BCFE5080B11936A67C52CC62D66C5BD2F53AD1DF2B16132A888EA3C631D7EA0FAE26AAD70E6659E037376365AE13C032845B287E06B537ED9E3550726283A3EC7EC8010919935EFDC18E1C455868869D89D2B72A54ACC840ABC7AFBB39E91BF071E86582AFBC07BEFDE60DD36D7737B8C2F84B7D496779DD12A547FD14D98EDD6EB7AD0E88FC08E3102AFB41AC4D74F8766AA6475B6723FEE42E51830FC47F7090ED1ADDF1D35F94F976EC09181E36E81C7D1DD2F26D35D26633CCAC4368B33E18CE69D42B9121127E5E23D4416A2F1BE0325BB5A32E914FCD1437BC35D0D9D99873481BB25D3994B1208850218D8E21709D44A3591F7E2DD7B55E9628F0898B890E42C2A783DFEA67C4747DC83BC0F485A5E4841F3E26C2A39B07B2D1939A265AED5F74E010249668DF38A6ACFF03EA8556003F0F1E7B568D9CD5D0FAA2190FEB55C098E3C ct = A89C39659D7A0FBB006773546299C09A8D1A2C1E31825DCE83855161C247C77DED1CBD3344E26388D288518283AFE4C30E9B83B7C2A83A3FB8F1290ED5B2102355C360CB7C18AD149A8F7E8D157FCD8D0240A18F3CF324690791EC9AD33B264355F7367027EDEDE00E98C70AAF3EF727898D7E90C1B3B1A1E90960E6141C2E6BEE51400BDAFF69A74CB5D296269AF82A7DB57963F15EF25DCB43E0A980E29A8E41BC4C5648173E114D8004BE3DF8AB497E45362A4F1535C1F7B1654E0F79BE515DB5CDD601FE0620D8C77BD3D6F6D404B4359CE6D9F97D92D193F85B2D6C912E405544C93345FD6E585EC3E2154502F9FA784A2C5DD6FEAD5A3D0C12302740AA5FB978302E357B10F3B8B52EB949AB86487B185450B3E8E4FAEE86930BF70EA737537777EF66BFA24E80353C5428CA0F61EE42A3D6191006C29D17CAAB81A8696B1096B56B88DC92C857F25BD5DA8FD551A5951346B9D466AE6B8C8A874BC78FA85B670D186C4EED2610A45F5529F73694C519616CAE6EF7C5178A48121F37DFE351577044B21F328FF9CC39375150090FAB ss = 847E40381D9F22A10B88A3F94286A927 count = 78 seed = 6A85A61DD08C0733FCBC158ABB49FE0B0D96A50DCCA140A2E9F5A254F1901985844613B1C656C0CB0112620591B88AD0 pk = 642360A0B412E8D7515CF84720336C3931F865AFDD13B25C130941D69FB7B81D57D3EA774602A895243CABF6FEED7CB8C65159E1BE8C9BC6410B927C6EA706E3802E5024904B7A1D682AB58D413F1C0D448C7F10FEAC8A255CE21274047A31EAE0E40EBC1320CC7068F7D84F347BB785FAF063494A239515A0C5D9D0211711793D2524227F81E33C9C0929FCC16CCBE3ED24A8D4D846D45F52878EC534D6888AA2C6FE956C7B45C7E56D99B6ECB4C7EFA7EEFF890C409E1D89D1934240C2A250B5829BF24ECAE9B0C00E4A8F783A2B4050533D4EE7F4389C604F40AB18F2B3428F0844387EFDF1C98D43A93505AF2E33164B21B9F069E2E47EA8AC3760E528E74E6230FFE534DE81A70B7C7760FB07FAE4D99516D850115AA8AD79086B44A022ED640775D38F64D051A4AFA8614157E8CB26B1AD27810D44F2A820AE22E51E2D948A626D058CFC1188FF66C6FCF87A658609ABBBDA2CDA0FF9EDA6480ADD631689E18D0D89C714C03CC1F062A8F7A98EC6E90B2F01EDD81A9E1E sk = B9A6B0C05677E957D41A34BA03BD06F2A9092E31F6338939E99C0E7B82BE89BC3C1EAEE6680AA4EFD394E40C2B3F30523C8117F7C26A8909642360A0B412E8D7515CF84720336C3931F865AFDD13B25C130941D69FB7B81D57D3EA774602A895243CABF6FEED7CB8C65159E1BE8C9BC6410B927C6EA706E3802E5024904B7A1D682AB58D413F1C0D448C7F10FEAC8A255CE21274047A31EAE0E40EBC1320CC7068F7D84F347BB785FAF063494A239515A0C5D9D0211711793D2524227F81E33C9C0929FCC16CCBE3ED24A8D4D846D45F52878EC534D6888AA2C6FE956C7B45C7E56D99B6ECB4C7EFA7EEFF890C409E1D89D1934240C2A250B5829BF24ECAE9B0C00E4A8F783A2B4050533D4EE7F4389C604F40AB18F2B3428F0844387EFDF1C98D43A93505AF2E33164B21B9F069E2E47EA8AC3760E528E74E6230FFE534DE81A70B7C7760FB07FAE4D99516D850115AA8AD79086B44A022ED640775D38F64D051A4AFA8614157E8CB26B1AD27810D44F2A820AE22E51E2D948A626D058CFC1188FF66C6FCF87A658609ABBBDA2CDA0FF9EDA6480ADD631689E18D0D89C714C03CC1F062A8F7A98EC6E90B2F01EDD81A9E1E ct = 6E7AC1C4C4AD722541C905C23E673C34664BACBA26541C25FD08ABC629906C0468CEFD57CE94C245C6B6D49078F58E8AFE2747C47569D7E7179909E5A78315520C19208B0AD916F3592F3878F8636821250189DE2B0FFBAC2CDA60023A263187F75967D9F6BF3012BB1014986AD6EA2B72534F006CA609DE4C2EDE35420915112853E2D00F9DDE7FA32B255D755398AA7F71EE3ADF091BDB65EDE1A6D14E28927B5A9DB0682DDB0F75BB157A973CC3104E34F315F8E58C89F97AC8A21015DA0338EC8BDC1987876D1D153351895FA0617AA42B670B730563FA71C983B3DD509FD6E0B7F58C02691C00083C8F62B5D38B4B2BCD18CDFB075A8A887612E283A02938ECE6BB7C3645406F715562924644959A96B5EFA4B61AB150965913B9CC88BBBF9F081C8D35B2FC4481725521C5BB2971EC9071C67E2A2A60BC35DF4C7362688D8B8A11A7C65C0F638CCC13716E18E2FAC5B6717985482811F4977D7568CC7D67405AF40942254C016D214C32A23AAFD87049725F494A6C5E144098F32F95B5E0979B37F9FA7EB3C49484707A7F1B6417AC ss = 1F4E558F02585211E37077BC66DF2389 count = 79 seed = 7F4A56EDA151E7B097CFB8EF980440FFF707AFFBA91867C89522CED6C5FF3BD7F5F00BB49DDD615D9361A7E4EFA42851 pk = CCC8419C22AD3E6EABC9665ACE9CB9251F8BA5BDF97BF482B6C4E091568F566D577455FA0C2F15215F27A072996AD3885DA8D09D918F18A6F7E82366D2BE33F2BCF48B0E7214D3BC01A4D134F1D33CBF9B7D8ABD5BFC9CEF7445EAE34D7126DBBC7DD47CE1974112B27E24EAA40C332AFF7318C5634EBE47770F31FAB1334C4FB59315D0A01F0CB21D3CFCBF82CCB20D88721DC622784B98B30D29CA6FE757E8376B6E2B32B5EAB474B593F1CADEA618F4A4324B4F9F8C363E6F21B82AF941BE8C721D8839D6C64167751E13850DA14603C8D4D179601AE9006A328A9E10013799C24EC705C9CF7722C40A1D97E817A70FA5EB24B9B70FF33A0F6A2A69D22236ADF666A0F74B496E7CA27432D41179F9B6EE6AF23BBBED639CD11CE95435EFB54BD416D1092D35607285D009B26AA53E39E08FC1EA2E69E704CA2D4D950097B461E7358AA628494D701CEC52FA04AE8F02A5BC224BE9DA0D5B9CB1B3C23DEB7921F7944DC29160864C89EFB7CB796E3E38F9DAA60C960DD21316 sk = 28A96C71577BA00C94F99FE965BC595A26DB2B3CA6AB5CF89C35D165453E5FCDC6F9DF64526D9DE698F2BD3E6BAC6C7FDD86601B9BA5F405CCC8419C22AD3E6EABC9665ACE9CB9251F8BA5BDF97BF482B6C4E091568F566D577455FA0C2F15215F27A072996AD3885DA8D09D918F18A6F7E82366D2BE33F2BCF48B0E7214D3BC01A4D134F1D33CBF9B7D8ABD5BFC9CEF7445EAE34D7126DBBC7DD47CE1974112B27E24EAA40C332AFF7318C5634EBE47770F31FAB1334C4FB59315D0A01F0CB21D3CFCBF82CCB20D88721DC622784B98B30D29CA6FE757E8376B6E2B32B5EAB474B593F1CADEA618F4A4324B4F9F8C363E6F21B82AF941BE8C721D8839D6C64167751E13850DA14603C8D4D179601AE9006A328A9E10013799C24EC705C9CF7722C40A1D97E817A70FA5EB24B9B70FF33A0F6A2A69D22236ADF666A0F74B496E7CA27432D41179F9B6EE6AF23BBBED639CD11CE95435EFB54BD416D1092D35607285D009B26AA53E39E08FC1EA2E69E704CA2D4D950097B461E7358AA628494D701CEC52FA04AE8F02A5BC224BE9DA0D5B9CB1B3C23DEB7921F7944DC29160864C89EFB7CB796E3E38F9DAA60C960DD21316 ct = 1DDDEB545627E5F2473D93D22E9A9B046281AB338AF1AF01D565A1C9F2A1DBB65F63ABE4EF76278F0E5E07A0679DB6FEB531F36895DFAAD8A497C5AABF981F35D4CFFFCF2CE7865696938FDA5ADC9220C814AFDF3AB6EFD20E57B8467260F10EF84950D0D76565E244CA856150553C0EA625927E98CFC8E592D531254F05C0648DDBD390EB619585846B7F83AC99AB56B2D5BC1F428E08263402A0121410E3B8DF61EED178FA02D1FC43EE753EE94B65C98A13932ADC58AC5CEEF8BA1C0FD09F26C4C5E3983C36F639DCDD11714B421A48C91D18D7F6AA5032280C5765E37D92545A9B4A0AE885B532069055A7A73E25EA31FA61B1356DEDE3AC183A4EF42F3350E03F4075F41B6539C21B6BA572CAFE30C2FE96D361ECF06E3EA986F991ACCDA5A3504669A73D0D978D5CDB531A2E6868BD74A7181BDFA143560228B0503D632207BA87DE12D3FC3FCAC3B89D1D79632C2A3B58894FE3A7D6E6AC30E944BAA01D0E77995538740DA805B0932227346337ED476B8FAFA250D91030E5866E54578F653076A71651DF7CB33952BC4DC4B35319 ss = C9E1C47EBFF65677C78699B126309CEC count = 80 seed = 09FC004519BCF85B20D25D314A0DFC79E00CB6262A7DDDF9C52473641AFB8CFA0F5DD5F53558184CAAE9EC34B459E98E pk = 90A457B5D8CDD1DCBDD2039BAD67AA4ECF08AC53F834ABCEB3F7525033C93840F31BA362A6973CDA35C5E5DDACFA427B2E0A27062A15F4CD575AA51B1D231F27F813B79F4671A301EFB77F75632E54F42BD110798A7CE02509B6BFC7326F38A3903B72DE008E58E74F79756D3AD307666AF6EB434478BB40F128C1EA7839584F9D89C1A33D47557FE312BD732EA43801F8CBD3C9C14C46C035676334373E749968D40227F9555D6A6AE1B0F326845C82F50D621185F7A2CB1FA382A609E449A3BB2939176376CA50BFCB494402CABFBAB0E68B3556C67DAEB2DC17C9B0C4A29C593524962DFBDD53DC4B6988B2BFD0C4DFF4E904DEB26257F4A6FF353A7A92C19B92F70E3655D8B222C55F8DDE38334572946778E89794770309601194549EE9B1370828F3F27F9B2A1FACBBB72702E3C67FE26F6E18252E6C0D1C0A612AB8D977FFCEA29622905BD85B15BC051507354AFCC59052561E464C6FCB5626E424B2091C2419BD495AC4322ED4B45799EE141C881B9B98B03F3F5422 sk = C08BA2EF8C3A0A043AFAD931652D7A19E6E8CB670F840DE55FE6141A25F7AB9F875F79E0A82D6EA5CDE5A017AB637D5FDB7C42646A1D710F90A457B5D8CDD1DCBDD2039BAD67AA4ECF08AC53F834ABCEB3F7525033C93840F31BA362A6973CDA35C5E5DDACFA427B2E0A27062A15F4CD575AA51B1D231F27F813B79F4671A301EFB77F75632E54F42BD110798A7CE02509B6BFC7326F38A3903B72DE008E58E74F79756D3AD307666AF6EB434478BB40F128C1EA7839584F9D89C1A33D47557FE312BD732EA43801F8CBD3C9C14C46C035676334373E749968D40227F9555D6A6AE1B0F326845C82F50D621185F7A2CB1FA382A609E449A3BB2939176376CA50BFCB494402CABFBAB0E68B3556C67DAEB2DC17C9B0C4A29C593524962DFBDD53DC4B6988B2BFD0C4DFF4E904DEB26257F4A6FF353A7A92C19B92F70E3655D8B222C55F8DDE38334572946778E89794770309601194549EE9B1370828F3F27F9B2A1FACBBB72702E3C67FE26F6E18252E6C0D1C0A612AB8D977FFCEA29622905BD85B15BC051507354AFCC59052561E464C6FCB5626E424B2091C2419BD495AC4322ED4B45799EE141C881B9B98B03F3F5422 ct = 6F03F7BB3BC8A42FDA1B7A8786EFD05EF906AC9EEFF520ECA6786411ECDFB9220E270AE0B7084CB7F166FBB5BD162EE5524258B74AD993BBC83816848C5F12D9E46180DAFA00C6CCA35AE13BED20D5735E2D76584E2B3AD0D5883502AD61F51ED01E2C27817DC585AB5BF5051657B14E13EBD9B0446012BC4F52053B4232C70ABD29EC96A2213C21B155B52E94B505BAE49072BDBE7351FFA6259B44F9B0C07A8F4529CBFEF5C9177547C8A8DACC9C0FC2AE27D904B7D4DC5B32B30D27E4260FBF06954E296DF28DFB73848D38FB58DBBB86932C2979EE19913C9799AC4C5454AC5C2C1D49BE237CF26C84B9F482BA71F6CE982D43F6E8127B2811051935263DD1ED4D524CE96C56F07F0278A97D5047C088C5E360971D78E0D9EF071F56C3909642E06F68CC7310035671E3D60B41E28F08FCBA900B8436D92A2F736F0652BE1A3629E766F4F262825F51D05B4CDA272EAEF488075021171A4969A202B1881FB1E2945D598A0836E8E46AAF34591297BDB498034A91E0E40C0AD0442FF0BDB43E5CBD445B6FE6A673712006219339E3F960 ss = B1539F6452E1BF74ED406CF80085929C count = 81 seed = E3C41CCA6F04CFE7732FD54DE30CC5CAAC93E2F80E76AED7D24A962A3969C1B6A311459A3EC3E510E3E9B1E4291D4D7D pk = DE9328EF6711E305CFA2CBDB563E1E3E0CCAC31B30B02AA92FE52053594DF4BDA18AE313F7F4084AD6C22B09C4660B5E16C1D71664A854A28924580CF3130F36832120605AD82ED5BB785960FC571649BB653A9C63F9934FDC55CBBD585797DB9B206405F1C03119327C3CBD69D558EE6B270A7483EF5779056BC134AD040044F7C54471C8C789D212F53F9D2F93DEBA6A7A827DEA59FD0795E676221374FCD5905300BD698D706DF1BA5835259F4AB84E25E58FFF2BA510EB340EC211D084CD74628FA11CFA992496878B1BAE2004E23C5A64FFFA5B29F3C0FDD4AB69F13821D3A9B7E4FB41AD0816EE685A9119A48C6A843B511145D93D239344022C0A0B449AE925A1D6FA5FC6504A663F94FE9A8848B6759AB197685A3A9349E9A902B417D9ED523D058B0CF5FC81232267577EA991893EC957057D2A8D301936C2B66341F92798B5CC300D5E1FA4AE449E88906824464A9216879FA4DBF94F4FD01286544990AA64F402708B03B35AA7B6959ED637A6D1250BDD410B7500 sk = 0E3B30E102D707538C2671060F603BB0B8A014103F132D6311EAFECA9E810796C34E8CFCE9D59342884456007B01DDD12EDCE6D10ED87E0CDE9328EF6711E305CFA2CBDB563E1E3E0CCAC31B30B02AA92FE52053594DF4BDA18AE313F7F4084AD6C22B09C4660B5E16C1D71664A854A28924580CF3130F36832120605AD82ED5BB785960FC571649BB653A9C63F9934FDC55CBBD585797DB9B206405F1C03119327C3CBD69D558EE6B270A7483EF5779056BC134AD040044F7C54471C8C789D212F53F9D2F93DEBA6A7A827DEA59FD0795E676221374FCD5905300BD698D706DF1BA5835259F4AB84E25E58FFF2BA510EB340EC211D084CD74628FA11CFA992496878B1BAE2004E23C5A64FFFA5B29F3C0FDD4AB69F13821D3A9B7E4FB41AD0816EE685A9119A48C6A843B511145D93D239344022C0A0B449AE925A1D6FA5FC6504A663F94FE9A8848B6759AB197685A3A9349E9A902B417D9ED523D058B0CF5FC81232267577EA991893EC957057D2A8D301936C2B66341F92798B5CC300D5E1FA4AE449E88906824464A9216879FA4DBF94F4FD01286544990AA64F402708B03B35AA7B6959ED637A6D1250BDD410B7500 ct = 54E763B0D9A6BFBA0303C86FD60FAAFF7C17C285C409C917D1AFF15A3CDAA8596FBA7C00BEB2CDB1A2F4A1F8C6DFF9BB7E3D89A30632F153D089603B1E5B37E3486220085FD493AB9250D58687F3BE07D0AB20FAAE68AFD81D929B5FA33C62115424FE158AC1182A6DDF943C8A2071C07C99DA3D8B4AE8D8C818054C752F4AC47FF3A24FCC7FF75812820B9F48AA3E9FDAED4B57538DBA1D7E73FD06B1B61FF9553EF23BE5180946B2FB64CFB1F8D57F0C5716C37CAEF3A20663FFC93F0139691C386812BA3A8F5EDDC749F42886C1F033A9D01C8BB81B45EEF8C694651BB0BC20C2E2DB4756FE439CD11514E7F5547C5E1303120713846BD9391937E0DF4AC2B1F862595DEC35E36967EE40A8E6693C05E458CB779084180F1694855BE7FA8D10E79061DE1B7BED9971FB01D82ECF0EC364E3454EA5694339FB2B8DFCC7DEE18BB44636DA0623C7F8922EAABBF052DB1B4013B2E1D0E2A263BC2EA16DC162F855C5DABF448C4B76294FD82256795F3DD062FE87E26A3647DA2B006C33BFA35369411A24BBE29BF79935532F93A3B910EDFD ss = 54C96066F192ECAB63D4812F427D3B6B count = 82 seed = 373FDDE922CFC416ED96B444E445BDD0962E8989F6C50ADF9912A89937C57217D3600B06C95440448E3F601AE69CA5BE pk = 97D03408EEAB6AD688C85FCEA80C3048F0203E9BFC05E8784DBC647FED94A11131C2FA20316FEB69A5DA69681C15C488965461606EBDF0DAF978E6262C4F3839EF2937D62FEC34606D1F4EA11516D4EDA4D131FE0F0801FFE65628288F083E843F9DC7DD832B18C21DD39A3DFCD6C31D59EE82257BB01CEDB747CA2B2340BC0A8DC6DA98A7A9F8B5A9FE8D2F46468597875393A00A007A28C09770E401385E35A98D855E80DEF8439C3B826D92FCD2F3CD4105A4F7BAB0C55294C2480C5C1253E09279D262FF422965CFB1270A0EBA7A9B4F1CDFF67E48F36CD997A529F8E6BCDB95E9B69D43DAAD25BB6D7C584C47B69ADFB45DCD98D8C89DF1D415FF598E5DDA597534B039CA4D1644D2572AB2C5E2AF895EBDBFCDDC332F25A99A5C376588C29013B151D1DE07B8E96C0BCB0857B3D1638580BDE55CE165602103EEE04D724CF84F1494559D8417D5A23654087D6B6DB81F73A6CF4E8F0F68CE9DD3982AA69B919B83484D4DB4658B230CCE4D1E8396FED568EDA7C17E5728 sk = 2478F7D3DE6041E7E5CD11C5E2EF483D1AA6218EB126444011136E2681DF2EF881B51A092A9BADBE72C9772C169808521C47149578621E0897D03408EEAB6AD688C85FCEA80C3048F0203E9BFC05E8784DBC647FED94A11131C2FA20316FEB69A5DA69681C15C488965461606EBDF0DAF978E6262C4F3839EF2937D62FEC34606D1F4EA11516D4EDA4D131FE0F0801FFE65628288F083E843F9DC7DD832B18C21DD39A3DFCD6C31D59EE82257BB01CEDB747CA2B2340BC0A8DC6DA98A7A9F8B5A9FE8D2F46468597875393A00A007A28C09770E401385E35A98D855E80DEF8439C3B826D92FCD2F3CD4105A4F7BAB0C55294C2480C5C1253E09279D262FF422965CFB1270A0EBA7A9B4F1CDFF67E48F36CD997A529F8E6BCDB95E9B69D43DAAD25BB6D7C584C47B69ADFB45DCD98D8C89DF1D415FF598E5DDA597534B039CA4D1644D2572AB2C5E2AF895EBDBFCDDC332F25A99A5C376588C29013B151D1DE07B8E96C0BCB0857B3D1638580BDE55CE165602103EEE04D724CF84F1494559D8417D5A23654087D6B6DB81F73A6CF4E8F0F68CE9DD3982AA69B919B83484D4DB4658B230CCE4D1E8396FED568EDA7C17E5728 ct = FF133B570CCD1DEFAB8AE44866C0D3DECE43C34A06CD04EF6570C514CE4F066F7B47F1D428AC6BE51F68B838C4D97F7A5E3142A6709AB20D3DDF67F60AC5380467E7FA0284D83582D59CC58EF24FD34128E64252EDF4CE0794171710FD4FC7EA0E4DFE28CA85F3DDC19825E5C6219A45244F70A277B44C144319DB7539114039349D5BC06FD168CE67749017AFBD90E68BC580625C07EF5367F5E62B09E17DFE89DAE09ADB00E21E719D8A1554108988FF07D94BBF4A423EE7D46B1E36B1E4A1136D8ABCA3CE5D171419415A6899436F250D2A47E359FDD0182DE0D40E3C2C6D86253AD0D41F54423832D339ACB7C01108895AD4B97EA01A7F9AFD1249490D78B5A1CBA65E0B3C6AE93EFD24709828778A50742C178D3FFE159EFFB11F0D8692640EB098FB2C1661738D3BF91512FB43C7850B66FC29BAB9458102FF5845A39E18C408FAED4FA3D23AB4425DF160EB27C9ACBFE6130388A9063AF191E2501BE1CAA73BA897CC4F3E675B459C01251CB131B6F3A1C629798DC53594AD8B48AB9F095735B917AFA97CCCF4738D64317C4363DD ss = EA52FD3FB349E68A70F89236C6101482 count = 83 seed = 16BEF67F7AC3A755C59C816478B75FCC16CE5844DB537791ACCD1EBD49D2824B105FD2E970F728C8F0CF16E439A9AE2F pk = D971FAA0DB5D1F80630FBD527CBB0D18184CEABD1564FF16550BA0A865453F25F9BC978B5D3DF1FE99E3D6E0524A75A5A7CC443D24513062F7934D99357836CB5DEC7E2C01BAD0E27C5E9200532A2CA9FCAAB69B143F63867050843244C76E9AE9D60A72A1D467E9ADCC965C30B93FB4A600BCE3E990F3102C2C56082E380034785CC4D220E84A4CDC509D2E248D9135A22FB6E77E1773D2F67A4EFE9781BA162E6C533DB743BEB473EA53433177ABA71B93BDABA4A5CBA2259747853B61A7EA2840D9F22455F65C5641962BF14B581B7C96BD874E705EF526D246A9F57ADC94656FEAF48E177D0105AE6069E208A02741E04BB79A30BF3A36182020D4D6B3DBE4C62B43F0276AA3627297BCFD32EEA82BC9797A7B07421C629500005C71C6C6C5156DA35A223E11A3C2D1F0DC3469F377BC0A15022BA95D187228ED127853BF4B36BD962C9433F50FCB5DFDA987279CE49A9BCCC898AD8FB53D35EF4D1DCD9468470029AD5558AB918EC489D7F36B95A5B40464B2FA689FA43F sk = 9D405D3EBDAF35FA8722DE431B669722ACAAEA2FD10B81436CEB14F7662BE0C42779459F69A145C0E2CE9F0BD9A0CD1BF32ED5694CC9AE02D971FAA0DB5D1F80630FBD527CBB0D18184CEABD1564FF16550BA0A865453F25F9BC978B5D3DF1FE99E3D6E0524A75A5A7CC443D24513062F7934D99357836CB5DEC7E2C01BAD0E27C5E9200532A2CA9FCAAB69B143F63867050843244C76E9AE9D60A72A1D467E9ADCC965C30B93FB4A600BCE3E990F3102C2C56082E380034785CC4D220E84A4CDC509D2E248D9135A22FB6E77E1773D2F67A4EFE9781BA162E6C533DB743BEB473EA53433177ABA71B93BDABA4A5CBA2259747853B61A7EA2840D9F22455F65C5641962BF14B581B7C96BD874E705EF526D246A9F57ADC94656FEAF48E177D0105AE6069E208A02741E04BB79A30BF3A36182020D4D6B3DBE4C62B43F0276AA3627297BCFD32EEA82BC9797A7B07421C629500005C71C6C6C5156DA35A223E11A3C2D1F0DC3469F377BC0A15022BA95D187228ED127853BF4B36BD962C9433F50FCB5DFDA987279CE49A9BCCC898AD8FB53D35EF4D1DCD9468470029AD5558AB918EC489D7F36B95A5B40464B2FA689FA43F ct = 1F2563859F0E09BE5CD4D9C0E57763513465F8B4F510F52E2F2CB87C09E941F9D06BB56425E94E495C71E5514DA242FDA88DD68400C05B3D6BF1A00213F114ADB26B0E92BEB182D06A1498AB45D6DDDE7E799C6FC7337BF0A335136BFBF8D393C90F48AFD51A419B6CC551E466F0F0BB4882BF7B864B4E93E51381BDC4084D3DB01B1939AD5A8811B39507F27110C51A09CC44689D09618F994DB989AC40F985A3836B502C298B6ACEB74B08CC4DD283CC17B8BC63191AD17CEDCE270504DD19805FC1D573E1426436A80164085C12E764FCE69BBF4B9B00573F6F86E7D4FE5A0610AF303E77C443ABD9709AF2DF2ECE70CB507D542009CA09355A39F36A89B4C620B0001DD3755D0C37E654E634E8A0B049863E07CAC4BAEC38BBD1FD10745B507163855E0F6C16D11FEDFD2AE3B0F1106893470446948FB66906D912DAF94736C7FED348FC7DD0156CB6F61D6D9EE1767E1405A3FD4C110D585AD68517BD59E9618C98F2C93A0C0E4C25F11390F691C5FBFF7B4DD9E7B4A208DCA6779C6EDC4906F0C6083EEA35897AE01975229C991981 ss = 86B83ECBD384B9FC9E99049CB7C82EF5 count = 84 seed = D0611F9AE5BE4DA5D7EADC9109944348E716CB3DAEE545721EEA8C892E7831CF2E54603146454CBFD92387739E9A78D8 pk = CC4EA3899EC60116BD548F1ACD092663810D63F74BB4CD71FA7D9B5A900E6C255A63F27021B744DD3BFA97DCAC329BF60742F68C8B2B192CCBC43DC78C1D1C440FACE0691058A0FB3D9A3D0CFCC38D733F5DB6E7F3D602196F3B1E79B282283571DF9515340330B87C94B2AB17481A88EFB6D1DA5674F5A83D706AB68E02EE7A94E4EEF70738F15C15C90AF70E0A34EFF05310FED0CC31262033106B6AADF9DD6D8708DC0611AC4992F0943A48A9C03F75944FEC854BC7C16C49734D23189AD44A6DE0BA7818FDDD5D4EE30A969D4C1D01384FE6EF734B6604D326D4EAEAED96B5646C39D55CF22495B53B71179B9F80C778CB70728723B24DF65B12526FBD5A78E76567FDAF40BDAE1EA432CF239F9B9A5DA012732764D218963879CAB8D161A6268778E170F74C9643E5C00D3353505A7E41533ECBCF66FDB63DAC50AAAD83E20505587DAB22E1B37B2F3DB99139F0928222F9C607D2D80B062D5ECD8362FDC6826A757DCB7EECD1740FD7B438077EA2ED3B74993523262337 sk = 9A86490F0615F3EDF789CB0654066E9EE339CC59F968281FFAEB2EF44D2F608621E831187CE79B2D2F4A20F1568BBE76B0D3D5AF36111704CC4EA3899EC60116BD548F1ACD092663810D63F74BB4CD71FA7D9B5A900E6C255A63F27021B744DD3BFA97DCAC329BF60742F68C8B2B192CCBC43DC78C1D1C440FACE0691058A0FB3D9A3D0CFCC38D733F5DB6E7F3D602196F3B1E79B282283571DF9515340330B87C94B2AB17481A88EFB6D1DA5674F5A83D706AB68E02EE7A94E4EEF70738F15C15C90AF70E0A34EFF05310FED0CC31262033106B6AADF9DD6D8708DC0611AC4992F0943A48A9C03F75944FEC854BC7C16C49734D23189AD44A6DE0BA7818FDDD5D4EE30A969D4C1D01384FE6EF734B6604D326D4EAEAED96B5646C39D55CF22495B53B71179B9F80C778CB70728723B24DF65B12526FBD5A78E76567FDAF40BDAE1EA432CF239F9B9A5DA012732764D218963879CAB8D161A6268778E170F74C9643E5C00D3353505A7E41533ECBCF66FDB63DAC50AAAD83E20505587DAB22E1B37B2F3DB99139F0928222F9C607D2D80B062D5ECD8362FDC6826A757DCB7EECD1740FD7B438077EA2ED3B74993523262337 ct = 65E5BDB7839542B08EA7EC3E3FCDC7A6586777F800E97A61489F53689E43CCE8A2B90F7661B954C3DB65A8DC39A0B20AA17905CE50F12D26759EFA11D60A3CE05B66442DAD446F23CC96EBB24BA416A7CF4ED914EA9B35CF08BD3B40665C6132E26AE8810EC533BE7F9F2D1A8C6CAEDBA2A09C76B4E04ADF78CC7631841244A7FBB407A71B9790AF5A39C7B74552F637BB72058534A45DA28599BB99503A6B9282D30048A38E6DF4B53669632E043708DC3301B07146554F8DBB536C29361B6D128F2D08A9D357D829D6EBADC01B8A43976629C6CCF78FBAE82F9F2AFC614B1B49F5AAC6EAB5D372FBD0577375EC10A8FDBFBB5666A2273163991E3426E5DC438097089D13D7807631A2B12B797959C01D8BE9AE043F525836CB872BA84E5E1A6AC9CEF99A54E89B786BC42401A22D820294AFA550E9147166DC3B0D256CDCAF041C62F26E5FA02661BA88FF30CAEBF2DA81488BE85A15536ED71615BF2A3F2EDE8474BD3B26A7509A5038BCE2609FA37C3E462984A26DA3DB266E37A2BAE46DBB151DFE320085873FE70B7146CDB208DB5C ss = 6D6C5ED8617BA9758120078AC91617D6 count = 85 seed = FBC38D7614D7718E931EDB850D2C6F0C5EEA9EE889B3E25BD69AC255D5B91E885D93E808E66BF9C88C655DC594DA5792 pk = 230A4D4E99ACEAE56E4A10FCCBCA69EB553F5E38D0B96F4618D19E2A569952F08685F1513B8FC59AB972444E387F236B42C9B6758B7CA02AAD3BB05D75092D849E295A20D0A3BB83F6F4A7313E5EA1FA5EBC4DB72E631E993CE3DB17105D5570B04EF9D76732769C77FD0F075C417472B0187A3AF07A45885048706D4D21945B8400981A91D9C9B6A2D727D0675879F34D0F759199BCAFF529B2F9E9345078D68DF3EAF78ACDFEADBA40B324AC2C4B46ADC6A662F0003236A5D1803412D65CD58BFFF0C37510BC913E68C333E7A4DC92C497EF9C981773D67D1594489EEF222BE2B37A63E8FB19A79387FA07D0C1732AE9CCE185C42621910E6F3617C17C8A9B7F787AF9CC130D47526F0D1194962F35C6C717DBD3AD6F29B1DA1778D055B8069BC943AC0084A93FEA544AF483D51A9450FA929261B782C622B412A7D73E98EEA0113E9B8924180EBBEC3449070692A806A27ACC73FD0C0782B1B6B810AE63820E8631F90B1A3580B81BA21D4E66BC5540189E04BBD8A6C40434 sk = 6DFD9B575872560C7BDC2732C4A28DAC4DB04E535EB8E402A2985C1C4D203778597947D710DEC806E36B0CD949FE460EF141213BFC525E0B230A4D4E99ACEAE56E4A10FCCBCA69EB553F5E38D0B96F4618D19E2A569952F08685F1513B8FC59AB972444E387F236B42C9B6758B7CA02AAD3BB05D75092D849E295A20D0A3BB83F6F4A7313E5EA1FA5EBC4DB72E631E993CE3DB17105D5570B04EF9D76732769C77FD0F075C417472B0187A3AF07A45885048706D4D21945B8400981A91D9C9B6A2D727D0675879F34D0F759199BCAFF529B2F9E9345078D68DF3EAF78ACDFEADBA40B324AC2C4B46ADC6A662F0003236A5D1803412D65CD58BFFF0C37510BC913E68C333E7A4DC92C497EF9C981773D67D1594489EEF222BE2B37A63E8FB19A79387FA07D0C1732AE9CCE185C42621910E6F3617C17C8A9B7F787AF9CC130D47526F0D1194962F35C6C717DBD3AD6F29B1DA1778D055B8069BC943AC0084A93FEA544AF483D51A9450FA929261B782C622B412A7D73E98EEA0113E9B8924180EBBEC3449070692A806A27ACC73FD0C0782B1B6B810AE63820E8631F90B1A3580B81BA21D4E66BC5540189E04BBD8A6C40434 ct = 818660F073D1E71F13F4456F2B0A4FC1FA772B4578528C8CFB2BB1DD424AEE2899F3BEC35D67E65405F72B10FE49899A707EF859F217ACD1CB4ECEBCA6632F7D4DA21C9C01158BE7565BFCAE02B71724C9D84130CAA2C555D614FB93D15A8C11FEE523DA310515ABB7B3562FF95CA330022F76DAF427C8248E130AF377211F62FFA7F5A4C1D71ED7F34D94A67D02CC3B4534F9FB48E372AF174422C348C465FF3D69965CEDCF881EDD9B34D8B14F047C271E548127FF990B77F9C4481C0E85EA4A89F5FED0F236D81AF6AEDAA53530A23D9F34C371FA518AC7DF99E009CC58342A1698782B2F4728134CD40E57F8C9122569DDEA920CC60D7AE5DF3FC6735E4B09A6E2E903E41BE67710AABAB7D72359C2F7E211374B73B20AD0537FE696AC4DC8BDA4B2FFFF28A0391C2B4C1755752A1D2D32225397D4B4655B1F917FBE4EF62CAA9A3289B95C5BF825FAC608E5A16C58D855D2565EA70F9EA5FA73E0A5C6A588BB9F57AD352802CEA7C20D4D04209987FE596A5F0932C9C619EBCC95E6E8A82189A8C93DFCCFBD28D20688833CB981EC66 ss = 6D8D23DB9FFA4384E25A93D2AB371B98 count = 86 seed = 1722219CB5DB47374EB0AF0232C856A57F026F1CB09E5A5799F4C333DD422FF6A0A67C4DA502FAAE727FB2D45DAFCF35 pk = 2850B78DE78F3D4875582C63771C2242556DFDDC20942CCBD794C386228FE949EFEAA976147CE145C8CBA3FBD57BC32B9506E267B97BFF84315E35797B400F8B675068CFFC3B2CF3330577C4A027FC808B01E01087B116D9F90EE0FA79D6EE2E79817F04AD3F5BEBD736B1570FF58B9CC78EF8A74ADB21999805AE4C7923A57E697C878C75B60FE1E44D7D6FDC4F4808543B5879CD19F6499499527B3B8DCC16FA7B516239EAFD3DAEEFCD576C5EE488622B32183492B54E1E2356900959B4F69DFD7290F118A001CE12F91E072761F9A3AFDE134ADABA3793C90402E1B1DD5001A42E7715270310B7FA03EEFEC775B10CC7B9103E6D96F82242F0039AD1DB386D945D03D19A60F1352A1329A8206A558434D678DC4EBAE951807F544BC5FB535BBB33F72EE922AA5909AE1B5AA09FB9B0DE6B2D6043F43850021AB683829C75EDD0C52A761295E40F8F663A88B71EABEA14FDE1A875D70493D2B2AEFF6F4C9A90389C5195B4DE21FDD97A3A3655C7A4AEC03219EBD8568B953F sk = 6FCA9F4E384D8418075CC064C70730801BDB8249899D456ACE7683F8A03D3CF04E46970FF7D6A12494AE12558346DFC8FD9370BF944A01022850B78DE78F3D4875582C63771C2242556DFDDC20942CCBD794C386228FE949EFEAA976147CE145C8CBA3FBD57BC32B9506E267B97BFF84315E35797B400F8B675068CFFC3B2CF3330577C4A027FC808B01E01087B116D9F90EE0FA79D6EE2E79817F04AD3F5BEBD736B1570FF58B9CC78EF8A74ADB21999805AE4C7923A57E697C878C75B60FE1E44D7D6FDC4F4808543B5879CD19F6499499527B3B8DCC16FA7B516239EAFD3DAEEFCD576C5EE488622B32183492B54E1E2356900959B4F69DFD7290F118A001CE12F91E072761F9A3AFDE134ADABA3793C90402E1B1DD5001A42E7715270310B7FA03EEFEC775B10CC7B9103E6D96F82242F0039AD1DB386D945D03D19A60F1352A1329A8206A558434D678DC4EBAE951807F544BC5FB535BBB33F72EE922AA5909AE1B5AA09FB9B0DE6B2D6043F43850021AB683829C75EDD0C52A761295E40F8F663A88B71EABEA14FDE1A875D70493D2B2AEFF6F4C9A90389C5195B4DE21FDD97A3A3655C7A4AEC03219EBD8568B953F ct = 8BAFB17C24ECC2884FD96437AD1BD7F22C13303AD91CD849635939FC1FDB0D68B9B7E8439C2F53D528CA525A335CA2AFFEC4DFFAD8E2ECFDA2E1617ED68C275E6C02476901543AA63F29B735BF4AEC1E2AC6BEF1838EF21FF22145573C9F9B41D517664D19AA4163C66D24E45F52CEE3D469C23450550CC21E9BCEC03413F0D48B714D518EA52E83E77B7C6B8917F4A84426B98F4A2D4705135971E62D17E47792719D9E4CAAAE5BE3AC89EE95E9AEB0C7518CA70F9E26F7FE19430E2ADB548FFB4195E5C5BFEDAE30845F6F2A4B3509A2E09D4738130BB35E69B26443E565B44FAE290AB8CE817CD5E821DBF1E91D4E39DA6628A05BF44DB2CC9F1097F783A1EDCA1432D8E9FA4D20C6F97984F6BEBF527C1C320EB54AD1138209AC9B4BA6A3762DC1D8D94AD8451660CF90BE9F6A38F6BA8CCB3EA7D1F67DA824B6AB242310E1860AB767EAE589E3928B200E1C7BE65F9F0E02394FBE4A89EA882A92C4D3B8DEE317A8FF05CC787F88EEB8A0CEB07A9BDF63B610AC1432041BC0ADE743D77F4EA5288D30AA3EBAECBC6962B9C19B6AE807 ss = E3FDE1D506D13594CC9856AD93406F79 count = 87 seed = AC139B78FD16CA0F26D6D7F9E15345C888D857B1910CF38D883339B37EAD2DCAC30F7CF10176F23FF34B4488EB79437C pk = 33A2EB0FD92DB950D2CE7DDB6BCF4512490CFC9C6662593005FBF8DFD8AF63F2A40AD26DD3CC666C2537E0128AA6340047FF71D20DAE7C7C7240D8B036F410747EFB15BC6500F07C0E4210C0FD2E77250BEB8E522AE7894736544579F9568E042E8D6CFAB27A75D56FE7982BC963B68A199BE8D60E96B4A5B7CAC0B81B33EFDC883580719CC62D481192ED4893DE4D57C73D8C0D2A488F8F4D749E224AEB42E0BD1418A8B5E3138E746DC1B3F3B6DB72F005BDE88D601F8B69EFB6680149132FA2916F04C15555D66F0EEDB39B05A284C94BA053749B62500E062ADE9D4EEA3D28C4BB53DFA61CB9789F867327F9EB5349A5853EAE9C42BA741B2F2B5F2C2A4D812DA687B8897A9CE3CF994F8B17C6CD0F0EF1841E5BCD82CE4D29C89386DA7309D0A2B2EAB7A67F686018C57977FA2B82ADF136E03E8CCBD5F41B40A1960F42A35EA57787334211A511FB6F1FD98E0D565E08D3FCEC0193F4F6E163C6679A9BDADB08ED9F120B6CA73AD0F8A9F45C032B9B965E3BCADAC7AA27 sk = E58F71BF175C0550A67E00E0F7B3B7FC36BC2707BF0C93047F7054814869CF7625E45647BC1547AFF288DBB90699B2AD84893F3B755D970233A2EB0FD92DB950D2CE7DDB6BCF4512490CFC9C6662593005FBF8DFD8AF63F2A40AD26DD3CC666C2537E0128AA6340047FF71D20DAE7C7C7240D8B036F410747EFB15BC6500F07C0E4210C0FD2E77250BEB8E522AE7894736544579F9568E042E8D6CFAB27A75D56FE7982BC963B68A199BE8D60E96B4A5B7CAC0B81B33EFDC883580719CC62D481192ED4893DE4D57C73D8C0D2A488F8F4D749E224AEB42E0BD1418A8B5E3138E746DC1B3F3B6DB72F005BDE88D601F8B69EFB6680149132FA2916F04C15555D66F0EEDB39B05A284C94BA053749B62500E062ADE9D4EEA3D28C4BB53DFA61CB9789F867327F9EB5349A5853EAE9C42BA741B2F2B5F2C2A4D812DA687B8897A9CE3CF994F8B17C6CD0F0EF1841E5BCD82CE4D29C89386DA7309D0A2B2EAB7A67F686018C57977FA2B82ADF136E03E8CCBD5F41B40A1960F42A35EA57787334211A511FB6F1FD98E0D565E08D3FCEC0193F4F6E163C6679A9BDADB08ED9F120B6CA73AD0F8A9F45C032B9B965E3BCADAC7AA27 ct = E1839CC42C1710F317FBA47743B9B6355700AF2281CBADACFDF7DAF4761AA491D7712A5B05F744F6376C4CF318FD92A5BA38E37D7F75AEDE9070C1DDF225297C97787DA6BB480D9C8BCABD60C3D33F1DFB9BFAC07DC99339B72CA01A5DDA6F9B71FF2EC9836DDD3592B82DA753F8E4A9BDCD4BBDB5CC83D642F15163B0075FA2B1BA78288DEE01BF29DDC6061941F6F97AF986A3C8F098D31B8CB4C58AA9985F3A5F131BFD5E2D9A5DBB7264459034C8C153A873784C08BA048BAF333831E75E7FC452ED81F365A0436E9CC65903943287F03182B8A3EABC2DC16F41DBC89D36BF6D2DBA557CA198A24C0EA8A11F0830BE1EFB4DC4037D953A6EA53081E7FAD51790D55E02A3DE2C7D6BFA5FC44AFD08A8D782F1B3C8CEF2D7BFB368A0905E938DB817367971B1A0BD30B000E221100AD23B4F6038148CA913CB00B41770159DE6183DCADC7EA401FF0455AE8EFC8B7E6DF60ACB72C7C5536F160CBB3F0C8EB7C9A4A794A196E1CA5CBC07ECEB478B5A56B035FE800F9C14B33876605FB2D28213E55DCACBC2F0279684A4E3EE9F46BB7216 ss = FE4AFDD6BA0C06756200A3004D6C7C88 count = 88 seed = CC7152849C98D5FED2813275D32069E44824ECB14EAEF425CE017448CD9A401C91C06D0F7EED6D22B7BBE8BA6C429EC3 pk = CEFC16733057373639D513F448235B5516C8B282C0810BE347246662DD533C79411AFCD9BE987F2C8A1598E8B3F128118E9F5489F7BFA40E3C47CD7038330B6D56A41D1FDB2C619CF7EDF971A8C5FACC209BB9E289EDCBCCBC5270014CB65ADCB438935B7DE3C1B59B2E8341258D5C329CE4B2F89A16F8189602F5484F1984A8D5FE55A6A4B0E93F0393E3F28ECEB5A9F84049B5BB0F9D39768F5273A71BF794FF8093ECBF86D8A23C977B435847BFB735401049267EBC38DCD495122FC8FE22EE42F917C9AECB628442522A369C010A30819A9CDBF635F4D79D389072190FCF98D2B3DCFBB35D1308DFFC9266EF316E46F862DA1BD71DFDCAC19116B338CFF76F541F077B93E3D927C45C01924F6E9E08678660056B06430226027E91012373A6439F97439C03FB17C9BDFA7CE91DA70ECA3A4853B7309C8AC11F2CF013A558E91EB62AF3D73F752DA7E7AE60BC5D010FFD43439366AF11787ABFAEC2FDD2BD3877DF61DCE564226CAC91D684579015B5C9FF1CD518B9872020 sk = E3FC575ED51513E62ABA655D24CD9C8F1C6C848AAFFA946CD82C2F1BF2E6AEBDE5660FA73356982E12999D8FDAFBB3CB186341D0386DEA00CEFC16733057373639D513F448235B5516C8B282C0810BE347246662DD533C79411AFCD9BE987F2C8A1598E8B3F128118E9F5489F7BFA40E3C47CD7038330B6D56A41D1FDB2C619CF7EDF971A8C5FACC209BB9E289EDCBCCBC5270014CB65ADCB438935B7DE3C1B59B2E8341258D5C329CE4B2F89A16F8189602F5484F1984A8D5FE55A6A4B0E93F0393E3F28ECEB5A9F84049B5BB0F9D39768F5273A71BF794FF8093ECBF86D8A23C977B435847BFB735401049267EBC38DCD495122FC8FE22EE42F917C9AECB628442522A369C010A30819A9CDBF635F4D79D389072190FCF98D2B3DCFBB35D1308DFFC9266EF316E46F862DA1BD71DFDCAC19116B338CFF76F541F077B93E3D927C45C01924F6E9E08678660056B06430226027E91012373A6439F97439C03FB17C9BDFA7CE91DA70ECA3A4853B7309C8AC11F2CF013A558E91EB62AF3D73F752DA7E7AE60BC5D010FFD43439366AF11787ABFAEC2FDD2BD3877DF61DCE564226CAC91D684579015B5C9FF1CD518B9872020 ct = 3FCE4F1D3FB741CAE7E131520375BA6C3EA07041D3ABF6110C7D621B1A89898C098BAC50DC32C01335738A5DAD8F2F02C1364F15249B0EE4A1606E11825E3AA55A10C8C573810ADCA2B2287E751DE63A2EA558A342F5CC211E7494B10D5EE3A6E79088158D7062C287B2005F596A2EC3776DD4A888E76B4380DA2BBA47395AA05646B10C474B4A1601CC35C35DF0B29F14A22DA8C1AC9C6069012392438BC72E2AA684646D2A280AFBFB66E608ECE881AAF1ABD2519FAA5B9C0AE5620F67CA5DC33CF3A1CB70555A99DB46ECDD00AE5DB6BAC324AA1685D233A97F6287790049C748519824524AEE697F98B034878EF8BB4DC0A26FCBBBA9483EBC3F14F5AFE062ADCA42765F04495CC5175DE992828C624718C310EFBE87161D4C3F4622B4DBDDBC98B6EA2FFE16D4A1C13AC71C17D6D866AE9EC0B929C48B3D02D67BEC8ED7DA7E1F03FD1D05211CD6E76FCB2776CC40C43D9A361FC4CECA9F8FE1E81E1023B79807151C3BD05704170F24F6FB484DD2054254167EC303882705783125F7752B3F0FAE7A8DF1EF8E920B7C0D46D54A911E ss = 2CBF3FF7698FE2FBE62024C72D132036 count = 89 seed = 96D9A06F88FF2C2036FA8E914B89C765E4A510B468DEE40F914F78858C811857EFE9FD0E17C0048E7389E8D996B7E2B0 pk = B064D7C66CCB1063770459C943C3C1764E39C15507845FD77D8A18816E879152974AA973453F5C351E58EB9BAE560F757ACBB69ACE83D5A5B3A9E6A553ED08D909E44B05AE5495CC7F790E2025AC71FBCED9289F8F5E855F3A7DFB4ED50C612D36BE3BA61A1778F66F2EEF977012C43193997959C84F85A33FD1AB23D039995DF342A4B398683467EF6596E24B90F72A41DB1F518E6ED23E45309C8A58DF6A67EF42EB2A235C93A2CF00D072B422AF16639038E22CE0C6A66E686D4107BC08029E778701C73113D99DE0A2850412A42A8A3EE41F8D3C4EC6CBB7A95F785193C7078EABF2CA4EA66C73DE2F94DAE9A53840A7FA86CCED3F10A4A0791471061F12F5F0ED06A7373B3348BAC90A84D1223ACBDDABB82759C41AFC50F85A25F4DBD86C013DF110722CCA65A42B55B67905C8B750E9EFE193F0CBCDC024B2B0AD5EE7A779A46003928FFB9CF262A00201FE03C02ECF5523F4BB4802D03269E5DAD2823C41C524B8E4D698684AE29C99728FA4850E0209E9BD703C9425 sk = 470B4943F0FE7FD0D8EC5185ABA0D1DB09D112934E4FB4788B2809FD40008BE70A6B184981101724BC3D5EC5E1956B510B82FD5AD0668A0AB064D7C66CCB1063770459C943C3C1764E39C15507845FD77D8A18816E879152974AA973453F5C351E58EB9BAE560F757ACBB69ACE83D5A5B3A9E6A553ED08D909E44B05AE5495CC7F790E2025AC71FBCED9289F8F5E855F3A7DFB4ED50C612D36BE3BA61A1778F66F2EEF977012C43193997959C84F85A33FD1AB23D039995DF342A4B398683467EF6596E24B90F72A41DB1F518E6ED23E45309C8A58DF6A67EF42EB2A235C93A2CF00D072B422AF16639038E22CE0C6A66E686D4107BC08029E778701C73113D99DE0A2850412A42A8A3EE41F8D3C4EC6CBB7A95F785193C7078EABF2CA4EA66C73DE2F94DAE9A53840A7FA86CCED3F10A4A0791471061F12F5F0ED06A7373B3348BAC90A84D1223ACBDDABB82759C41AFC50F85A25F4DBD86C013DF110722CCA65A42B55B67905C8B750E9EFE193F0CBCDC024B2B0AD5EE7A779A46003928FFB9CF262A00201FE03C02ECF5523F4BB4802D03269E5DAD2823C41C524B8E4D698684AE29C99728FA4850E0209E9BD703C9425 ct = F1D911DF1B6E0533094946E1C19E6160167933020CC8C83298A1219D1F608B204EB59B7C71A1B255603513B05E3CE4D5A9E49A545B5B28D66CBCD3665AFF333D284F1565C8461E786CF841097EF536CE7D767E32401AAB3A4AFF28C932FE9AADB858270C65211C11B3557C0FC1B587FE7735383320AAAB0014D84CDFB9030DDC8B744BBFEA8D420EAF5E5C4FA61DA399027E5AF1A2E782B9A0E0C60907879C22F8722F5D30AE8F935AE08FDEE80C1581BE846B73BECFE0161C54FBB03E19C44B1B9D459B7682ED85BE33B5E001E99224E94B4302120FA81DDB87C47586C7C8CFBB68170BD2E8272E921EDEB5A3B70AE53F0682C3A56CDC887BF6A70A7449FE4F3052EBAC80CDAB82B66B102D33449025C9E99E4DF3EE773F0A62BA6EB3F197338277FFCCB5ECD2BE51DE338AB6222D4CE2D9E6992F2056EA072C064F268B12ADDE576DFA38A754F3D28B595F15CFA844574A65A33DC7525A5471A1B239E862F0CE07D513AA3D05285CF8971878394A87CFE235A7848626362A1CA3B2D1175F9FD1B2224BA92754904745FE832B240C4AD9F8 ss = D4ED66490233B2FBBE6597A368AA1C00 count = 90 seed = D26CE360D399BF7B89DC364AA7AC06BB513EAB8F527383E93E30727EDC3F22C262AA0EC70257B39EDFF0630DCDC1B79A pk = 1C3F032E2C6CC0BE4676928C3B33E47730CAD51C89884D3A7F4D2B9C8B454587971AB783E8FDA00644620CE8AC6A697C9D0E760E1EE366BA1D2732FA3B96372CC9CD8BA087231C1A046DD600F85EA5106EAD0B88D7C4A012556F54E593A34398B8AEB6F52C9E5966C0438B0025E36780F9E0CFAE9076616767F054C41A0BB25A83E3AD7DF4F44B36E660D4F41D3BCECB91965F091466BDA74824190E3CE9B2914D71D4D6C6A5F556678864D35FC096057AE124AE49AB45B96119A3F71CCD89310DE40E4A28A0363BAE92C17220BD3F92F4C258D3C412FC5FEA0EAE6621C516992532DD4BA241A5C821F8592C98E180021BA6B0638FC64406DACE8604A43CC384884C309CE885C1410368AB735FCEB08AEA6452C2A06E025F986418DE45857BA6A4EB6D48C561E8D3C74AEB027DD18311477391BC25ABF322210736CD892E42BA416ECF54D5107296743FCB387150343A9E9FA2EB9DD8988D00BAC2AB3F509DED286D882E1E098AC93B2ADBCDAB0CF60F0F6A5E214050822C5C22 sk = 6DF4385DB978D27B27D2AA5E452E4152B36F097503D9581AC95FA08ED106CE84660E8A4C90BD2B22634E40769AA0090A101C5DDDAD45ED051C3F032E2C6CC0BE4676928C3B33E47730CAD51C89884D3A7F4D2B9C8B454587971AB783E8FDA00644620CE8AC6A697C9D0E760E1EE366BA1D2732FA3B96372CC9CD8BA087231C1A046DD600F85EA5106EAD0B88D7C4A012556F54E593A34398B8AEB6F52C9E5966C0438B0025E36780F9E0CFAE9076616767F054C41A0BB25A83E3AD7DF4F44B36E660D4F41D3BCECB91965F091466BDA74824190E3CE9B2914D71D4D6C6A5F556678864D35FC096057AE124AE49AB45B96119A3F71CCD89310DE40E4A28A0363BAE92C17220BD3F92F4C258D3C412FC5FEA0EAE6621C516992532DD4BA241A5C821F8592C98E180021BA6B0638FC64406DACE8604A43CC384884C309CE885C1410368AB735FCEB08AEA6452C2A06E025F986418DE45857BA6A4EB6D48C561E8D3C74AEB027DD18311477391BC25ABF322210736CD892E42BA416ECF54D5107296743FCB387150343A9E9FA2EB9DD8988D00BAC2AB3F509DED286D882E1E098AC93B2ADBCDAB0CF60F0F6A5E214050822C5C22 ct = 902BA4320C75DF263CB6CACF83E47084F65598A7F903B7D891F80B9084FAE8D2BD8680BF82EECA492E6B1C7DF5E32DBE1CF02A7C501A46F2FFA223E291171EFDB0B4DE8C13A98C1E8DDD721565D015152040E823626C15DDF5A968803E77E25BB1637A18BA216D63D65DA957E912768D79AC7F46C4C8044951FBF4A51F09DFFBCE78C34B898CBDD8B5ACED13F5B4581A74A82C9942F7FB389F76E070F85B591CFDCC59380884FCA79D5A84C4DCA61E6813D410C9B6726D0D550905A91FFC589AFC4A5BAF9F7E2928A69DB6BF074C7C9B114B8AF61B8DD8FB7C16A7EFE09D1053152A797A4DB68CA695D1FDEB9C7D0879EB500CAA65D547288112B21C9FA9FFDA52A91B9DA8C8C41BFFD4D75AF11C07CA6B00AE02B45418F26447568DA90482474D82E04A1FB1F0DA9E8DC7C652C72AD078C1FCC5382ED622C39510A7A2C3F5960692B323012CF7818E894DC6B786D92BDBAE48A95F8C2A20BF4DAB5A2912F994F66679BAA49E7EF45CCCF434568927A12025FFB1FAED979EAF208BB70FD13658C6B55D2895FE9798AA3B37EC201418B8B252 ss = 806E56F46611E29B349D7CB34E704C69 count = 91 seed = C5856298C3CB6AC9787A0F30938537AB2635B96F6D19CC9522063360E7A5C88E644929D2879180E3E5BCAD2422B7CFC3 pk = 0A9647127903BE820A711895C7734CE6174DD75821064D59E285465EEC15B440BC100EB962362EFD3BBFCBF31D0449D6EB52A0FE56E67FDB2465821803C50C41E16455951265D43E4ED164ADC78FB51250567D260D63E4EA4A13A54CD4941A0B0EAC4270F9C8EC1739F1A4542CA0486B73AC472B19EDFF38DFFA9B5BAE15BD8AC9AE38FAF5421F586D9E0E802B5200D3C8A43ABF784BC40E34A31F3E36A0F6E5E55E8F2EA3254CBA8693260D6A70095F9DF1CC357223E3E4982E43562952283863B7DA170DCD074B3A61E997502F760297DD5D9B4A9BD5F3956F4BCA1817D61A5A29A8982F74BD794E9496E147AC80A0E986E4055FE628C9350293298E7204A6FE303B622D6FCBB97DABD2BC64BD922A44B355560758D1EA77186AA66ECEDBF3E8C6EC537AAC701336868490F088ED06AA549EDA4E71FE7916643FA54C45AEC1461C76EE1F968E9F1D74D7E095B7B2C06B3F9A8698DA0A4E4D7E24CB49BDD6D64F3BC0C83230700001D14FDC071043A2EE89C758A81B92086707 sk = DBACBA825728444921B227CDBA54446B3F6881B47BE9CD02E15274A8E2BC08FE818B117BA28C5DFAE74D54FCDF6F20052F79BE333EDC8D0E0A9647127903BE820A711895C7734CE6174DD75821064D59E285465EEC15B440BC100EB962362EFD3BBFCBF31D0449D6EB52A0FE56E67FDB2465821803C50C41E16455951265D43E4ED164ADC78FB51250567D260D63E4EA4A13A54CD4941A0B0EAC4270F9C8EC1739F1A4542CA0486B73AC472B19EDFF38DFFA9B5BAE15BD8AC9AE38FAF5421F586D9E0E802B5200D3C8A43ABF784BC40E34A31F3E36A0F6E5E55E8F2EA3254CBA8693260D6A70095F9DF1CC357223E3E4982E43562952283863B7DA170DCD074B3A61E997502F760297DD5D9B4A9BD5F3956F4BCA1817D61A5A29A8982F74BD794E9496E147AC80A0E986E4055FE628C9350293298E7204A6FE303B622D6FCBB97DABD2BC64BD922A44B355560758D1EA77186AA66ECEDBF3E8C6EC537AAC701336868490F088ED06AA549EDA4E71FE7916643FA54C45AEC1461C76EE1F968E9F1D74D7E095B7B2C06B3F9A8698DA0A4E4D7E24CB49BDD6D64F3BC0C83230700001D14FDC071043A2EE89C758A81B92086707 ct = 10DF5522874D9666F978D85F3CD5A404E15D9D282A887F45E6ACC1AF3B4BC8C837D0937C20846F5C6BD1137B3D3E6139A7ACB92E0627E09C48A08CCF916F1837674E10391CE6B866C845AA9EE6F5C9137415DCF4017B7B37A61CAC12A648F5B7B7FD64423B989C6ACE8D14E4B95E27F0A9157AE2D3D2604BC18298A4C515694D4407BE3C762D499978CD00CE253DFB713B7DDA9BD25B8D892AB3AE47AF9B8B7D598A04BCE222CCA767AB8AB45F72C73253F669666D621F4C3BD805AB34314F81FEF89EDD5D1B26C74C38A8AAAEEA5937B5D3948E9A01B7C1668E7F8338EC44E3C70FE5DB06D802600512419D9F1E2035314422B0ED4B91467B9BFA060CF7DA41105B8F191B745F7D809087C91D7E6A8BC9C99483D1593EA84B7ABBEB7F5AD20E018A5A74C2319F65292B63885A918D14B4503EB79445BC2977C50C0ABB0A64E5EA713E74CCF3EDA00FF31C166334BDAF9AEF608A087BC3F34229D25CFBDA3945EF94A89DD8538A197AE2E0A7D8CC40E7EB0ECC13EE45E2BA72389BC6EED10A9FFB92EFC940D756EA70CF3B8E447F54C8BDB1 ss = D448BDE9B6537AABB3C2C3BA0A5C6AE3 count = 92 seed = A28EAD0A08E7228AEFF602B16A1E752278B8ED1E91DAC67994F5ADC372E1D82F95CC390CD97AB9212275E0566C833FD8 pk = 430954DE5B960282592E869745318D82C79C22F68D579A070EA97B8FEC1C5D9A2DE15A6504E6CE344132B36063668101D77ACF38C84734C7EE32F546E4750CAD0B8808EDFD5E4186C6426D8839CE47917ACFA4AC3BCB11BDD1C221167BD968A48D790FAD9F3BA49479D0391CF8A9A24A194BC17497548DAB60198EC34824500D8DA6092A4831F2D88A3C1AC71FB91460A369A9125DDB53A3E1A12256BCB27FDB01B04011A85B411FC2003EC36A9EA0E43E71ACDE05125E58D58B78012622AC37C96537AC947A608A3186E05CF7BC809BB693D133103BE7F2C0AE64854DA0A694BF15163243D9F2F1CA457D920CDD4D638A5998EE0954D62BFF67610A58084B8BE7D3D7ABF586CB65F4A16FB07E2F8A2871A9CDAA9B5ABB297A31586B6DAEA50BE067546FA90C3A191118E88A24D061120E3C16AC7F6F283A9BDD0270C608BBFE1F960822B6139360D2B880236345364869D7573A4D8A870F526EA4FC4A337F0691105E3FDE2ED55BA6EF4B774B4E4CDE7567CC26E0A783852538 sk = 690EB71FD7052B906EAEC09937A8ED374E0B02AFA27C2F1481C38C2CB5CFAFAC81B96A810AB749B61806B6D54C9F8CF4BF1BE0192423280F430954DE5B960282592E869745318D82C79C22F68D579A070EA97B8FEC1C5D9A2DE15A6504E6CE344132B36063668101D77ACF38C84734C7EE32F546E4750CAD0B8808EDFD5E4186C6426D8839CE47917ACFA4AC3BCB11BDD1C221167BD968A48D790FAD9F3BA49479D0391CF8A9A24A194BC17497548DAB60198EC34824500D8DA6092A4831F2D88A3C1AC71FB91460A369A9125DDB53A3E1A12256BCB27FDB01B04011A85B411FC2003EC36A9EA0E43E71ACDE05125E58D58B78012622AC37C96537AC947A608A3186E05CF7BC809BB693D133103BE7F2C0AE64854DA0A694BF15163243D9F2F1CA457D920CDD4D638A5998EE0954D62BFF67610A58084B8BE7D3D7ABF586CB65F4A16FB07E2F8A2871A9CDAA9B5ABB297A31586B6DAEA50BE067546FA90C3A191118E88A24D061120E3C16AC7F6F283A9BDD0270C608BBFE1F960822B6139360D2B880236345364869D7573A4D8A870F526EA4FC4A337F0691105E3FDE2ED55BA6EF4B774B4E4CDE7567CC26E0A783852538 ct = 565B2B7E871425D6C7466C603B988A4D09D3CFE2141D8636FE9AE8FDF4A788CA96DDFD45708ADA67782BAF8A246C0B34BAA46A3D435D440B2325AFEFFFB922195C0F9BB74396A48192D203BF218F7A40A9D43488BC1ADAB0AF7A65BB81B53FBAB94984AE806CCC969D94A587635DCF6EC909F120A9B35D1258319043D32AA1AE350B3CD969601764CAFEE84E310210F3E49F56B86AB0610AD53ED68316278CD20DEE85F1BB68F522C43787FF56CFB735C24005699F62E86D58C890AA0CF762F189C70F006889BD2176DB918BDA1863F3A9A22D0B095467B56279EBDC24C5B39471A9CBD7D57508ED90614B775292362CF634954D497A1849F4C2AE289D59AEFC0F30C0EC56D4E3ACBFC2CBD12FB8FCA902A5BB67A331B368E1710D6B0AA4C3A0F5AB4E167BB43FE4A02C179FA6E85F4C97C434285BE36CFDA9AE29864611EC717C21DFB6068F6AB87AA70433A2F2D0A9AAA11B69327F4CCAD6B722079D1179D4F01A8F914508FA6ED2E9FCD4600D12046C8DC59388C0AAC18012043154B4EFBE7D36C6592FB0A434C5087E143FACF3018B7B ss = AF3B268BDFBA03AEA8B35CF5DEAFAD99 count = 93 seed = 92877D706DAF88EF3412EB143DB8CD91BC047A9A43B7ACDAA42523560DEE4C172697BE4332042FCAB91135839BF74AB2 pk = 23C9B5C3CEF34344ADDD53B40A7AC18F7A620E9427D4E372AE517A2DC3DFA7DED1F5F8C28F36B3218264C92B0E87DB0F8AD2BF369F0F951B3B141EA627E42C5479C10A4315CF9AEA9BFB16CD81B7DBA3E39346158C2D997C98D46E3AFE7B5879C29888A87A972AEC9214009FF433FD716DC9E3B3E70EBF98A3055ED5952831B3E503F62D2B41CC6DBF2690514DB13FC137EC41B9BE3EEA69E8B65EC00A783720363F9F6E43263B3ED2B078B0B5A39BE0A35B330B3D09FEA903A8C8900A484FEDAC0AD5CDD11D22D6726750A05A90B51E64BB1E66627E9D86132505F831008DE6B8DFBE6056AF462742AFB2BF9B5CFE8F71E8EEE2563BF5E701495A2C5B1EE23404914A47DA4D0086E7B4CCA497B06F29F500C43E0D62A57625817918835848CCD3C9A7794E52EF60B8EEB39219A1D9FCFF3C133831AE7811C2EB20C4FB7E8F3E35FB5715D591D61C50F6492A4A90CF9B9298807541466210492D29D4021C131A20029E02709AA94A85CB3F185B5E858BD21B17A4837C877B4A40 sk = 32E0EA9089FA928482C0770DA545AF1BB871A03CE3860413C06C5BEF7B6508409DAF847A64C8D30D0974FD3BA7476DC76C46B458A036D80423C9B5C3CEF34344ADDD53B40A7AC18F7A620E9427D4E372AE517A2DC3DFA7DED1F5F8C28F36B3218264C92B0E87DB0F8AD2BF369F0F951B3B141EA627E42C5479C10A4315CF9AEA9BFB16CD81B7DBA3E39346158C2D997C98D46E3AFE7B5879C29888A87A972AEC9214009FF433FD716DC9E3B3E70EBF98A3055ED5952831B3E503F62D2B41CC6DBF2690514DB13FC137EC41B9BE3EEA69E8B65EC00A783720363F9F6E43263B3ED2B078B0B5A39BE0A35B330B3D09FEA903A8C8900A484FEDAC0AD5CDD11D22D6726750A05A90B51E64BB1E66627E9D86132505F831008DE6B8DFBE6056AF462742AFB2BF9B5CFE8F71E8EEE2563BF5E701495A2C5B1EE23404914A47DA4D0086E7B4CCA497B06F29F500C43E0D62A57625817918835848CCD3C9A7794E52EF60B8EEB39219A1D9FCFF3C133831AE7811C2EB20C4FB7E8F3E35FB5715D591D61C50F6492A4A90CF9B9298807541466210492D29D4021C131A20029E02709AA94A85CB3F185B5E858BD21B17A4837C877B4A40 ct = BEE4161A2C48A54BC154BC5B284D7F87532C362F7ABABD6F968C58FB5F058B219ADC756E60F5FDDAC45B5A826826B72D9CF3C9C9C7455E819EE3E00D38B6175CDBCE0F623CE5B6947803F0DD1780A291CFDB0793A1BA9E2938445477A5FCB641E4B25DF61BBDC16B8DC41AA971ACFEDAA8C3A64B969279AD24C4576A8F2583C4FC6B71514E008E13886CCBE102BAC64F1DF84E1F5A298A481CAF632E39791E7582A69BEC356AE4BCE2D29B044FE6E4B2C48D914EC0A97E6E5096A7691584BAD003E2C84494B486626544C05E696A027AE0CA59BF1FE555A5ACD6CCEC0771275A19BE7203408DEC18F82C718EC20C6DF9BB7A721B4B26A370419D78201D8779E08A7E636AA685300F0C4559178201DF55E72D2BBBF58099CADB8A6879C2D3A1BDCDFCDB74DB8EF9DFAD07114F213E9577002D3316AE379154C5F40C45D112D2F2123D54FF0535C6E03931B163318E0557B84FA6642E9510C7327637E141AF4B36A41850E5A1CA00BBD77E7A473DE1306882FE84A0E81BEB2D7E3167B859262DABB7D17763FCA642A46CEAE868B097F4683F5A ss = 9D82E096201465C407349177A7EDFB94 count = 94 seed = BB4C0082CA4044B1FF60B036C9B0E0495D58667156786C530BC69D949A13BFAFF53798E456423D7A0E162A60039367D7 pk = D913232981DE98DA969E91F7E4CA2BDEB2116E8D970A1AFDCC33B102B77D84A4DBAD8D97E8E2306C324C4C9CCBB2CC1AE8E186D5915C909829422847C2D903BC27578F9756CBA4BDDF40E808F68D4435A227A39CAD0502E00DFA4B349171284017C70733DDED3E6098A26559B068CC6BFC5B23380DBA76CFF845894ED3355C0A44B16733D8EF57D96080DB419E24D9B97FEEA6F20587471964CD0C993F2A2B795AFEEDE32E98D21F88193A530B3EED16E989774825E05CE8B75F1B5E01E364D1C9E1CECA15A33488A53D479C31EEC4CB9C9FBFE42ACD57601AE53255F0C6A89D662C83707C6CF65651757D63C26C7D0FB410CEABCC1E826387AAE229603DFA0B1A5142A4C99B607E1BB58BBD913207B1A949B0A381D869C67E159EBC39F409885E8092AC1D935FB968C8C701BC016DDD044592E7A79029B5108C032A21A2FD634C7DB5CE0374BA18B528B6F2ACCE9843F0F8A6D6266B0F07503C419AE35359AC9C2B7A0D5E3672B04A6F74873030DF6FA4C9961DA58F0370122C sk = 6FB2EC719F2A0DEA152BF3F64B9D148F8AB8BA88F64E61F54F797C007E4061F95C7D56CFC7EE5C49E849DDE3FEA8F25E7876DF2A18515C04D913232981DE98DA969E91F7E4CA2BDEB2116E8D970A1AFDCC33B102B77D84A4DBAD8D97E8E2306C324C4C9CCBB2CC1AE8E186D5915C909829422847C2D903BC27578F9756CBA4BDDF40E808F68D4435A227A39CAD0502E00DFA4B349171284017C70733DDED3E6098A26559B068CC6BFC5B23380DBA76CFF845894ED3355C0A44B16733D8EF57D96080DB419E24D9B97FEEA6F20587471964CD0C993F2A2B795AFEEDE32E98D21F88193A530B3EED16E989774825E05CE8B75F1B5E01E364D1C9E1CECA15A33488A53D479C31EEC4CB9C9FBFE42ACD57601AE53255F0C6A89D662C83707C6CF65651757D63C26C7D0FB410CEABCC1E826387AAE229603DFA0B1A5142A4C99B607E1BB58BBD913207B1A949B0A381D869C67E159EBC39F409885E8092AC1D935FB968C8C701BC016DDD044592E7A79029B5108C032A21A2FD634C7DB5CE0374BA18B528B6F2ACCE9843F0F8A6D6266B0F07503C419AE35359AC9C2B7A0D5E3672B04A6F74873030DF6FA4C9961DA58F0370122C ct = F2D57C4147393BF0C0373BBB8283B729D1051C2A71649D023874295758607558A548A6C6378E557D0A9061D2FC20CA0144273D4ED0307DA344D7BFEA1E1102095CA2EE728F1A1039D97A0A02E10DBA755547D5AA96C7F61245D62B3AA755E64572DBA8C779DD12E1710DC276317A8405B43E643593237E9E77C934B76B374BADA574D735CC0EB1C51B06B7DAFA69C814076B9F8B8FD9F930AC7035B1AD5B00B00BF6CDB1C7253660A8962080AB504C54E65CC7C8D7EA7B540F4B408E03F672F25E73BC8ED4021D053995EA1F2281B5AE8C54FE0992B15377E5D6AEDC26878F312C30B94C67208594E3E2A5A6C52C2379B0C0E0AF0B5CDD179E802A03A0573326C9EE570D1D614F2B2841B586ECE4A48E60E0E36436161A75DBB8712F5D9DF66E33CC474FE8A961703FA7E32CBBE07EB19EC2AEF72C4CF957C67516F84B166E7FAD60B6E37849B873ABFE9E785E3BE4AD5C7A0F45B4CE30057CB7F7C72BF70E8B6849505C91BB57087215B9553B8E51D3A31B80E228559CA18315703C7E8DDAF0818EC89378A01264B5EEC2AC430581394DA8 ss = 61B9BB7BC624F9CA9CE12830CE844AA7 count = 95 seed = 121D90E70AF6204445D0DEB28AC0C108262719E9FD3476ACA74BBFDE89FAF04D8D5F89A624E8A75DB80431F0D10AD28F pk = 3922C55C30B5A26A7AFD74DA9FFC9D75E626697F3E0FC5A04EAB4F87A05C5237C5BAE2F90C2B05712A915DC201C011B22D00F232D913E430D7BFC1EB0FEE360ED5C54E961F36C4152305B30B89483E7F7E0C9E5D6752AF092F8A50AF7B5273044D11D151914A871E8C6749976FB12DFD9CB3D01E063B8A6D25B364780B21EE533010A92B12FD6AF30928722B5C2FC82F7903D38A72B80FC93AC6AE623593EAA3064111E1D940665CE2598EF2F1F63890E447083CB816649C50CA87B929CE5926721A4A1F2A939293A6F3AE4FC39796548ED080EE97B2A6F1A826B8EF71171C599B0D19281C86665D26B90A07EDE1DB472AF78318B2CD9DB08FD8CF00ECC0819F90E07783A797CC5F6DEED95E340FA726E050EBF9C736DE4DE91CC4FA072A919B675898EEDB66C6479507D191C84058CF0E98C9A79FA66F5FA74D30B290A8F271A512C9EEBAE39072960DAE6A1FA1EC1DCC938283E426CB2EEE3E6A87A3EB1C2F5F5C379E84192DDAD1A868B5C89A3342FE4E46828821BC9EB31F sk = 527FB88C8BD9A4D6031DAD15E63878ABD2B559E7E08D61F6E32D432B4F9F751BDE0496C580A181FFED762AA35454A02D3F1F47EE0394C80C3922C55C30B5A26A7AFD74DA9FFC9D75E626697F3E0FC5A04EAB4F87A05C5237C5BAE2F90C2B05712A915DC201C011B22D00F232D913E430D7BFC1EB0FEE360ED5C54E961F36C4152305B30B89483E7F7E0C9E5D6752AF092F8A50AF7B5273044D11D151914A871E8C6749976FB12DFD9CB3D01E063B8A6D25B364780B21EE533010A92B12FD6AF30928722B5C2FC82F7903D38A72B80FC93AC6AE623593EAA3064111E1D940665CE2598EF2F1F63890E447083CB816649C50CA87B929CE5926721A4A1F2A939293A6F3AE4FC39796548ED080EE97B2A6F1A826B8EF71171C599B0D19281C86665D26B90A07EDE1DB472AF78318B2CD9DB08FD8CF00ECC0819F90E07783A797CC5F6DEED95E340FA726E050EBF9C736DE4DE91CC4FA072A919B675898EEDB66C6479507D191C84058CF0E98C9A79FA66F5FA74D30B290A8F271A512C9EEBAE39072960DAE6A1FA1EC1DCC938283E426CB2EEE3E6A87A3EB1C2F5F5C379E84192DDAD1A868B5C89A3342FE4E46828821BC9EB31F ct = 7B02601899FFF4BDFD0239FE924075CEBDFEE6EC1B8F67748831107487FF564A89353B669643D67DEF334976F3896547131D5A237C8F533F2DCF62F751301690B3C138F9912224276A47AAEB91A6742A3CB0DD03DF7572652B5EE7841C586F601F53A620E20106A7FB80F02848C76190BDBB67C2776668C01BCC1EB96D24DC2D91C8C5C27F59E154B78008B556E9C71B2BF4B6B7F74ECF79D18F280D734649D7F032E3E88654463122FECE207945A91B8248E887FE74D9B2B75E8988038AA856407502EEE2A10E4898FDDBC9811FDCB28EEF9921E65304285F0B35E211522306DA2871E4C2C2184705C160728A723E086C10550195A7FEF6105C812477EF6830351913723F484B51B2B7D8360C02194C26950264C66EFEEA8F2FEE313537AE8F3B26F2C912900748C0A9A5C363C2D0FC441B3173E45F454401102C08B00DBCD7334BD09F2AEEE6A3083FC96296CF5648DCD6AF956694861DAD11E94651FA35E9F07072EF39CBCD2DD9BF518FA5E3BF71E613746161E8685FC8155FDDE292F967D94D0C5FDC56FAE3F6B772CA46BE9572B144 ss = D497BA97E27D82FE6518B7D0EC8DC5C6 count = 96 seed = B3AC6503206ACCC2A92CBC210D020A2654726911D11CE676AA04FEAA08AF1D20C654E4105883AE470EC3AB299075D420 pk = 2FA5055424F34F8A109F21003007E710FD34A036E827EB0F7185F84863A660ACE7071F31149C8C70DCEC3A54F1C30C6698989B69CF58F1CFB7F48094D42C0AE8C244600F65C5125B7673A6A3E811BC87D30028D207E2A8127F791B530E58E9F6B3B5D7BC0FD93BBB9825760A525761E42AD39B75C3D21119CDE47EECE50F3AB14A21920AEF1DB71706EE6E8C2834D9F73724EB48A85793668D4A16404285577DEB174AF4180F25A1E8C447FD574A3345A0CE02BE47334ADEA0058BA214175B5A228F710DDA2AE09828EE0FAEC36D54CB5E81F240F7C57C1497C26B67D64EB1FF70AC361632DEA6FB44D4E1CECCC691E42DA4C07FBA872CFF54A9C73D03CCBDBDD717D1C47FC5805571EA087F89AFFB85DC9EC46EB549A58A5FC80F510FC608E111E6955F6B9D8FE8D7AC51E0FDD5FAA68BB4E5D78232D9F2EBCA11AD131000AEE93970CD892400E41E8BCED34DD5747EE274A78661EF85B1509C3E5E33A8EDCBE961D8D07725B2378C8A41CDA8E59332D6AB43903B1059111224 sk = AC6FCFAEEEF795B6EF9E062F02BF42975FA01E7D91BA832F5AEDA108EA4D6C6BC0FB958286850422BC357CA67B83C986048E0D0087FA110C2FA5055424F34F8A109F21003007E710FD34A036E827EB0F7185F84863A660ACE7071F31149C8C70DCEC3A54F1C30C6698989B69CF58F1CFB7F48094D42C0AE8C244600F65C5125B7673A6A3E811BC87D30028D207E2A8127F791B530E58E9F6B3B5D7BC0FD93BBB9825760A525761E42AD39B75C3D21119CDE47EECE50F3AB14A21920AEF1DB71706EE6E8C2834D9F73724EB48A85793668D4A16404285577DEB174AF4180F25A1E8C447FD574A3345A0CE02BE47334ADEA0058BA214175B5A228F710DDA2AE09828EE0FAEC36D54CB5E81F240F7C57C1497C26B67D64EB1FF70AC361632DEA6FB44D4E1CECCC691E42DA4C07FBA872CFF54A9C73D03CCBDBDD717D1C47FC5805571EA087F89AFFB85DC9EC46EB549A58A5FC80F510FC608E111E6955F6B9D8FE8D7AC51E0FDD5FAA68BB4E5D78232D9F2EBCA11AD131000AEE93970CD892400E41E8BCED34DD5747EE274A78661EF85B1509C3E5E33A8EDCBE961D8D07725B2378C8A41CDA8E59332D6AB43903B1059111224 ct = E19EC3A2A5DEBA18785B43BF3DFD3C5CD42437E8EE05CAD1E90A1E31BB29B702E7C1E9816FDC69F63316DB52A202E7AAE87182DC739876CD6F15C9E431161992D59EB24573011F84794E86ABD5C3CE984005A3A0BC6C119E981B966BA62A469803F99F931CF1F0A60824F9CF911F12A9310BF1006DE0DDF536B03D4A0531C95D266D041ED42962305C0B94E29CECDA3310E18AA5347F0CABC4C83263A9A9EC9545EB039E432407C6A38EE6609596E6A4342733EB679B055043AE1DBE29EEF46A4EF9D5F2889A18BFE9FEC639FDF90969FB81EF301142582A11F2B4226C5378AEFB8D8B7DAAF5971C1D634C1538964BDAEBA2FE0CC0B15250A18D700E5E487F0207CE260491C18DE6A51D400C57527FE1B2B7554D2EC92F07D0B6FF0476FD10451A61393D1A7B0B17D5E4194068968AD771E91E01228AED91BAFC028054C7AFD8D9DFE84E4402D28EC1EF590333005C2C56DB5FBA1C96F2444CB6C87AF2C3A3B6597568C70174314AEC9E6B0E029C3C744017135511A5F52FB3121097E644A195C04BFC3486E5AAD1BB4E8D206A193CBC3C9C ss = B64FBB053B17B28CCCF00B1248F2B8E0 count = 97 seed = 59EFF60B1EF6185DB34EE1E3B1DD2F159106CECEAA79BEB74923B4F5623D5BC52DBF5D2594A1F7C6C64D12CF144E9ED4 pk = CDF0B6B1DFE7BEAFD0ABF3A9733364DF7487CD3DD3E1801211F0D65CB72DE2EB644219CD8A9843D0A03B9655ECCE0DA9E30A957DB9A6B462F4BC10B1406D1D0C6E69CC488790762F16F107DCF66FBA43876153FD49C13F69A07CE77E36D7961932B192BFFBD36B789ADCE88959B5879FF4A84D523D8356A1F03BDAA8B53A24039DDA5063023F255340D1A856D364E0082630623B518AD30803ADE986415C954C4BD7C8BAA17A864F36F767612515FE1C2119829213D4C8BEC185D81F30B2AF7F8528BCE3A492E3E99B5A1295F1136D12E101622174952FA60FF96FF75EF371B63956525EEBFDA9D203F9934BC823B2C4584F35839039C661DC912A0A392E5FC6A81412D807E1BAF56AA48D4265150AABA871A6D6870739214D0B209E5F64B06440FAED4867AB33935B12EC30886CE37E15B5E07D4062FACDB1D406B44266039B02AC5B18428767F96C48E7518304C5035FC4F436EF251FBF1C4C408CE639F222BA0F24E28F8D72E0A67244456DDD3D0301B45A6F0A339DFE572F sk = BA2FB9318D4DBE7488057C33E95E6F054583A2800C41BB83E63F8FFDA3565C2424C89B20974B748A65A5ABA75133FCB3156DFB6626A83B0BCDF0B6B1DFE7BEAFD0ABF3A9733364DF7487CD3DD3E1801211F0D65CB72DE2EB644219CD8A9843D0A03B9655ECCE0DA9E30A957DB9A6B462F4BC10B1406D1D0C6E69CC488790762F16F107DCF66FBA43876153FD49C13F69A07CE77E36D7961932B192BFFBD36B789ADCE88959B5879FF4A84D523D8356A1F03BDAA8B53A24039DDA5063023F255340D1A856D364E0082630623B518AD30803ADE986415C954C4BD7C8BAA17A864F36F767612515FE1C2119829213D4C8BEC185D81F30B2AF7F8528BCE3A492E3E99B5A1295F1136D12E101622174952FA60FF96FF75EF371B63956525EEBFDA9D203F9934BC823B2C4584F35839039C661DC912A0A392E5FC6A81412D807E1BAF56AA48D4265150AABA871A6D6870739214D0B209E5F64B06440FAED4867AB33935B12EC30886CE37E15B5E07D4062FACDB1D406B44266039B02AC5B18428767F96C48E7518304C5035FC4F436EF251FBF1C4C408CE639F222BA0F24E28F8D72E0A67244456DDD3D0301B45A6F0A339DFE572F ct = BFAF1FBBC477132CE35A5EA50FE891A039D62F16FB8C388D5139547A22721473AA348DB790EE5B24D8E5EE8F7BC535005CA1C26475F407A323BCC6BB349E0CC27B03F1769D8A08DF48F5B5D4389CC42C4C06ED44BCC7096B59ACE0DCADB79FDC127FDEC2E071545072D559C0262626F6414B956C4F1567E954446896B5293DF91F7DF8B1339B8B882C01940F8A3F7C55296B574695C53A7DD3E192644EE91A81C3ACB65C65D7BC3856F14383C2FD2C2C233068404FDF251011D5AC0229F8A07FB9BDD9BBBC861E2DA38F0477864139C37D2308DDE1DE8423E767226707CC5FE72CBD44164A2EB46B1E1418BBDCBE3214B2B47107B26A29F2A73247305970F082036349E5B30169A5F8BACFBF54C56051BB73D3BD7C1C3C0501D58CF7FD27135592FB70B79A3CCC04252E6A601945F6AAF19239EA713F8260E5AE1FED463476A86DD33D18FEF1A94A16B75286AF54B4934B0D57FCFCE4E8A053769FB6BD01C0443DB52F0DAEE2F7A38630B245A99B0D445B2DB1698F6915B064034F93AFFE5C7F8C8647F23B05433C7E60C830F8BE077F3A33 ss = DF4D730A8B11B7332EDF0E3476537C15 count = 98 seed = DDDCA9DC31BEA737D3F474E7560B37FACB2F53C803E768FFAADE7669FF94B1D4FBD17068CFFD5DFDD24AADADA4EF6B12 pk = DE2856B4723258A97190E2B84633B573FD9B39E1DCB68DA025208B3250FDCEF6D42FA1A58BDC4CDE6423131DF793FEAA7D66A9CD0EB6D48765CE3D1A9FAD282BF1DBB7B74DD1A4469B0A9F73115107D0DA8A09078A29F81D715BF95115D33C16EFA857B54801CC99A64D5E1B40D65A3E8C7D5AAEEC9B1CFAEFC01158BF1E6485618B519EDBC680FA96B43ABA058392D7F7FDADAD49C0A1751F58CA0C3EBD2948DC47BF4C4AD7ED1D43720BB2816AE1B3E1A39435FBD5C07922E443F930F33375E6090B1246BB18F20B10EB882F658F0CD4A9D18435D7B632A9AB86807030F28B349093EEE0B2A5949BFFFDE709BC0817F78B570AADC5B6679DF4C4371AC5207F9261CB846171F477C79E222D770857E0AED2009389F2C3EDD0F582F3288E0DA9D915983938B04EF904FFFA3F3E94BD4759C7AADCA4C5DE16E03D18C535B4DD464032DBB3A85122F2E18CF53CD3D0897C315AFDE007FDFDBAE158D0B3B81A71684CA3EB3E20904E6EB931F51D2522F0D741FEFE46113B725B7320 sk = AA6DD1E5799CDF7AF9C4FC632B3EB9D51D66E85C8E0A21ECFDA268813EFAB5204EFA60F78BF81D320D01AC09AC06244F7AFBD2D80FD35609DE2856B4723258A97190E2B84633B573FD9B39E1DCB68DA025208B3250FDCEF6D42FA1A58BDC4CDE6423131DF793FEAA7D66A9CD0EB6D48765CE3D1A9FAD282BF1DBB7B74DD1A4469B0A9F73115107D0DA8A09078A29F81D715BF95115D33C16EFA857B54801CC99A64D5E1B40D65A3E8C7D5AAEEC9B1CFAEFC01158BF1E6485618B519EDBC680FA96B43ABA058392D7F7FDADAD49C0A1751F58CA0C3EBD2948DC47BF4C4AD7ED1D43720BB2816AE1B3E1A39435FBD5C07922E443F930F33375E6090B1246BB18F20B10EB882F658F0CD4A9D18435D7B632A9AB86807030F28B349093EEE0B2A5949BFFFDE709BC0817F78B570AADC5B6679DF4C4371AC5207F9261CB846171F477C79E222D770857E0AED2009389F2C3EDD0F582F3288E0DA9D915983938B04EF904FFFA3F3E94BD4759C7AADCA4C5DE16E03D18C535B4DD464032DBB3A85122F2E18CF53CD3D0897C315AFDE007FDFDBAE158D0B3B81A71684CA3EB3E20904E6EB931F51D2522F0D741FEFE46113B725B7320 ct = 0A82BD0E9BE858268FD4D3115CA21C18E3165F358BA3707C879716A31EA982B48C4D263AF5072EBAC1217D0EDC2DB39EFF918F26A27ACD737689E3D189B515DCA30F8A87F0917358E92EC1DC0965C30AC36234589CB459017A3D4A2D7209F1A98E27D850C4C254128C6E534DAC504E3A2BF50CF622D0B8A766CA97449906841F6668E5FB8A5EECF8AB7DCC83450DCF672EB7729AD3A0949A4B41A6D3AC2FE2200E334887E6F233BA76E96BBDAD418D8D436F64E173616C1875A4485C2D87DF5D0B1369A75F708437041E1A564F7FA4A9CCFD0FB9D9C54A24F3DADE58B780E492C19EBD95FBE10F5D6D653F53E20061D675157BE787DB17C9CA403A1123200A242F690BAB5F483D69822B7095E2D3B6C0F476178E43CF7D849FDFFDC72A7A47D8E49A54AC566CD91C0A87FBEB03B9E40584D0375BE0D38FE9B76A149C7B1F4FD333488A05985F8205918759A4155F26FDBCE293370E2060EADDD0DD30D5409997561D30E3417C0F4EF54168C0D4F7C3B8314B9CFBB07744DEB7292E6D675B0281F69AF84A5BC932E6E284DB8316AEE384E0E7 ss = 06AA77743FD0AA114A1556E07703D7D7 count = 99 seed = 2A6F7386B815366F572AEB6C79E272CC21B7095FE09575F18072C9D677DA23BC9C8A4BC393B7524604D299BEDD260C8B pk = 6F09614D1FC5D9E28D415C5199D5FAA6AE43EAF4B343845013F8686E1E9307622E5DE10B33FAD352E39DAB1DEFD80CB4303B5A7313EA2975BA7ED2499C1E31BB5AEEB38D5D42DF335121A9E605C442A61813DD263B0CBC569531B6B528F2F5AC26EF0F4D527617F438DBCFAA2278A4453EEA82AEDFA34C04882D7F7DFB3F5BDEE600F836E745FECC7E29017039F3FBEDCA257885CB6ACB4F509C7575FBCE8113EDF43B35189E4EAA109359FB7504D2939D4FEE94716E574677B5CEF307A234E3B053A952805C18526D6F7C10CE4E81A8C2BF2C91A5BBB2F7336825B048F97EC989B0AFB5B3700AF3E7C187A67332E2A9D646ED2698779C336373FF1EED37A7AB93C38BEDED373599F8EE9920200AD9D7165E17640F5CAF72F3BCE13D3690CA0E9167015247464AAA855A7487CA2D8CB92962863D1D779FB05EF41B5F9B651E7C2900BA3CF648CDF449CDECA443A139ECBB910D82C5FDF5B33CF1BFCFA629B4874BABE33038B23C049E185C75389F92F0EB6E04FBBF4F396FFD06 sk = 195D6C86A3DF4C21E3007D7F2768B43C74CB3060E0ECA77FAE77E0F9F21EABD8C0C6EEA7767F4E10FDE5C2D79B8400BF96B19014B457EC016F09614D1FC5D9E28D415C5199D5FAA6AE43EAF4B343845013F8686E1E9307622E5DE10B33FAD352E39DAB1DEFD80CB4303B5A7313EA2975BA7ED2499C1E31BB5AEEB38D5D42DF335121A9E605C442A61813DD263B0CBC569531B6B528F2F5AC26EF0F4D527617F438DBCFAA2278A4453EEA82AEDFA34C04882D7F7DFB3F5BDEE600F836E745FECC7E29017039F3FBEDCA257885CB6ACB4F509C7575FBCE8113EDF43B35189E4EAA109359FB7504D2939D4FEE94716E574677B5CEF307A234E3B053A952805C18526D6F7C10CE4E81A8C2BF2C91A5BBB2F7336825B048F97EC989B0AFB5B3700AF3E7C187A67332E2A9D646ED2698779C336373FF1EED37A7AB93C38BEDED373599F8EE9920200AD9D7165E17640F5CAF72F3BCE13D3690CA0E9167015247464AAA855A7487CA2D8CB92962863D1D779FB05EF41B5F9B651E7C2900BA3CF648CDF449CDECA443A139ECBB910D82C5FDF5B33CF1BFCFA629B4874BABE33038B23C049E185C75389F92F0EB6E04FBBF4F396FFD06 ct = 64FE6121722672B67D0D46C164937F19029CAD597BC6A4820351D818E6AA4A76F480F9C26BEDC07111FB18129902AB2C47463FF34A0956D07E2B91B465C23CA86D6C50F8B7D057DA700C2619ACF1D97947CB288D26927B620D8D09673F195C08BFDEB261B39DF0BB4182DA8FA025BCEF386FD8A3E382EA36198AE2EBB102EEDF335FE54F2B426FC2C98B55C21A61C8D6C053EE7149825A8E21D4B282CF99DC5456579428DAD837CA1C9292B4FD8011FD3C6D9BD1FD3578F6FA3AF40123F8EA2293BB0728D3881F5AFC60150243D8E7C4E67CA1B208754B7963DE32356A33DD683D30133FEDF1B876A153EA08FD8139CD3B492969438771F122EBC93E8F19599EC7B41B8BE30268B2ABD00564A12E04B3E89B04921423DCE927F84C6B6C4BA0030F722A68662CFBF5CFD61CC6FE7815469FACCD9A210FFA8CBD6625C02F8684152C63C07DB242C40503168C173D3B912E93DEFB76F17E402CC0FC233DC2EDDA2A9432B0574BB71A90358FE3438811B889996D885B7B4E45E895078EF1B0E6D8B61CCA4E33888107C93ECFADBB5D7D973C9485 ss = CFFB43BF3A34E38EEA47DCF8A87851E8 golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/etc/PQCkemKAT_644.rsp000066400000000000000000013453221343600534300252150ustar00rootroot00000000000000# SIKEp751 count = 0 seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 pk = 7C55E268665504B9A11A1B30B4363A4957960AD015A7B74DF39FB0141A95CC51A4BEBBB48452EF0C881220D68CB5FF904C0549F05F06BF49A520E684DD610A7E121B420C751B789BDCDB8B6EC136BA0CE74EB6904906057EA7343839EA35FAF2C3D7BE76C81DCA4DF0850CE5F111FF9FF97242EC5520310D7F90A004BACFD75408CBFE8948232A9CCF035136DE3691D9BEF110C3081AADF0D2328CE2CC94998D8AE94D6575083FAFA045F50201FCE841D01C214CC8BBEFCC701484215EA70518204C76A0DA89BEAF0B066F6FD9E78A2C908CF0AFF74E0B55477190F918397F0CF3A537B7911DA846196AD914114A15C2F3C1062D78B19D23348C3D3D4A9C2B2018B382CC44544DA2FA263EB6212D2D13F254216DE002D4AEA55C75C5349A681D7A809BCC29C4CAE1168AC790321FF7429FAAC2FC09465F93E10B9DD970901A1B1D045DDAC9D7B901E00F29AA9F2C87C8EF848E80B7B290ECF85D6BB4C7E975A939A7AFB63069F900A75C9B7B71C2E7472C21A87AB604B6372D4EBEC5974A711281A819636D8FA3E6608F2B81F35599BBB4A1EB5CBD8F743587550F8CE3A809F5C9C399DD52B2D15F217A36F3218C772FD4E67F67D526DEBE1D31FEC4634927A873A1A6CFE55FF1E35AB72EBBD22E3CDD9D2640813345015BB6BD25A6977D0391D4D78998DD178155FEBF247BED3A9F83EAF3346BA90098B908B2359B60491C94330626709D235D1CFB7C87DCA779CFBA23DA280DC06FAEA0FDB3773B0C6391F889D803B7C04AC6AB27375B440336789823176C57 sk = 7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB148032DCD739936737F2D8626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB8FAB0A7289852106E40538D3575C5002017C55E268665504B9A11A1B30B4363A4957960AD015A7B74DF39FB0141A95CC51A4BEBBB48452EF0C881220D68CB5FF904C0549F05F06BF49A520E684DD610A7E121B420C751B789BDCDB8B6EC136BA0CE74EB6904906057EA7343839EA35FAF2C3D7BE76C81DCA4DF0850CE5F111FF9FF97242EC5520310D7F90A004BACFD75408CBFE8948232A9CCF035136DE3691D9BEF110C3081AADF0D2328CE2CC94998D8AE94D6575083FAFA045F50201FCE841D01C214CC8BBEFCC701484215EA70518204C76A0DA89BEAF0B066F6FD9E78A2C908CF0AFF74E0B55477190F918397F0CF3A537B7911DA846196AD914114A15C2F3C1062D78B19D23348C3D3D4A9C2B2018B382CC44544DA2FA263EB6212D2D13F254216DE002D4AEA55C75C5349A681D7A809BCC29C4CAE1168AC790321FF7429FAAC2FC09465F93E10B9DD970901A1B1D045DDAC9D7B901E00F29AA9F2C87C8EF848E80B7B290ECF85D6BB4C7E975A939A7AFB63069F900A75C9B7B71C2E7472C21A87AB604B6372D4EBEC5974A711281A819636D8FA3E6608F2B81F35599BBB4A1EB5CBD8F743587550F8CE3A809F5C9C399DD52B2D15F217A36F3218C772FD4E67F67D526DEBE1D31FEC4634927A873A1A6CFE55FF1E35AB72EBBD22E3CDD9D2640813345015BB6BD25A6977D0391D4D78998DD178155FEBF247BED3A9F83EAF3346BA90098B908B2359B60491C94330626709D235D1CFB7C87DCA779CFBA23DA280DC06FAEA0FDB3773B0C6391F889D803B7C04AC6AB27375B440336789823176C57 ct = 36302536F3B06833D5C3CFFF5A4A16107232C6BB7E6F304E5BEDE23A85DBF3B688C5F617B6F5676B98798C8C4B82F522C55E903351B1AD1DACB224210728C8A2ED2FB86EFA6833987435B1AD207B6B220418D3ED031D6F133577B7B97F3DC10BE721F049A23E2452EEA65A70C735A38EA796C1175E126CE74532C62EF55D817009A8B5B4AC898DB033A461C84FA9B0C87B90BB8909DC2597EDB150E843EA44407338882CD0846C50F268E37942B7EFB4E1D6D56CE443C27C939A9349B52E7F94FC5C08F36F6D5183F8EF6D2EA3CEDEF5AE5ECEFCD7F56D3B52DCFAE148EA3D32D31F4A5661644930DA4B13D86B404E20A4E2C484435BAE601AF297C77C33015E7979E8F5ACF71A4947D7FE7A9C6452EDD9EF2E26E5C7DD10BB37122670BF838E0D741961AED4E8375B06376F84AE46F4A92691CD9F2EC9FF4B2EC230C3CBDFEA2530973A0DDD399D195A768C931BDA6F66FC858CC6B06B3633119FFD641DC754EDB11F050E78F8727CD14E27324C89EEFBD0210A363C853FBDBA92226FC7BE186D0C4F9CE881DBC11914576CB34FEA1D9FC57CFD566F760F498C8E3BE50AC7B65420CF5E29E230CD42D7202A4AC55D5A684681CEDD37D1306C5AA9FBE5E7CF32269B644E0557C9AA67A0681D1045FA1B1FAECB6F2F01B9B84442144BEECEFEAC1397B57C6F368CC8297E0C5DBEC8685854E23935BE64F3D29855EB8253F560804536E16F219752BD9B9BB8E5D7002E7267CF0D187DF52FF38737E0730D4220DE26F2E492F3F9B31C21C154349DF4AA43B291ED6B5BDF4EE685E993A1D700C908C4DDF13E6D0EA2CC2FF6F62363EA8D9163C526A0 ss = F8D828CC5D615977C076CF6CC43A45A861217A4B0111C0C4 count = 1 seed = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC81ADDE6AEEB4A5A875C3BFCADFA958F pk = AC6E29FF400C6DDC9664D5DB1EEECF79C05A1180B648E348862E6654B7C72B2A90ED83C9C01F6C3554DEE8E77F66CD90C5DDE53C632E40BCB3B8D5C58A6C66C67A1232737CBE403ED18B4E7151AF1E863FBA0CFB292062D5109C87E6774690C067AE4FD58792FA61D796802D09EA5055868B09ACB7FA0FFD89D565F4BBF0A5004A7B9B519CA1BAF57E49D6C3779D6A2DAB7134B12F9177E4DB1E625A36CE44A8A08B3C29155D9E756472055CD0421DA8A4ECBE020A603109C13666261CA4551C839790D68AEEA8B5D4DB209C837E0B1660B8DA8111899FD7B396FD1BDDA69E1BFCC097328579F597B0DA1226F93AEDCBE9ADE2B44FB2438E22D4FA4452C69AF0404FE971BC7C7453D28B5DDFD1E82DA5E6EE30FB62947E403551CE1F6EE99C356CEC8A4BA3BC4D742FC07D430A184E499C97AB32DD51732519985E94400334752DEDE6B34D77D5758B3439E019393CFEE20849FC239CDF079B99FFF21B338DE2657F174EA4EDF272F44E6B45A3FC4C8FFEB4AF4412D90C160BC23442FA08315E52A416EF72A05EC0AA3C197D53C7C46BAE403BD3BC0BD22427843F0930F59144D128E9E8324240139F804AA0C6B53BA94AABF13C6202BCF6F0D3F14426E53E784116EC16BB3E7A85137A8D635A064252707AC23ED2422549C480242C3DA583975AC429339519A94867020838E99F8BC7246F88B6389FA09C5C3B83FE1C44B6C3E6FF9620C6068884FA0D25CCAF3C8DDC1DAE83C3FF03F12181C966A6829485F0AAA0C5D60626E7084004EBF996DF42BB747C755D sk = D60B93492A1D8C1C7BA6FC0B733137F3406CEE8110A93F170E7A78658AF326D9003271531CF27285B8721ED5CB46853043B346A66CBA6CF765F1B0EAA40BF6723F327918FF97790AF87AD7C2F6030303AC6E29FF400C6DDC9664D5DB1EEECF79C05A1180B648E348862E6654B7C72B2A90ED83C9C01F6C3554DEE8E77F66CD90C5DDE53C632E40BCB3B8D5C58A6C66C67A1232737CBE403ED18B4E7151AF1E863FBA0CFB292062D5109C87E6774690C067AE4FD58792FA61D796802D09EA5055868B09ACB7FA0FFD89D565F4BBF0A5004A7B9B519CA1BAF57E49D6C3779D6A2DAB7134B12F9177E4DB1E625A36CE44A8A08B3C29155D9E756472055CD0421DA8A4ECBE020A603109C13666261CA4551C839790D68AEEA8B5D4DB209C837E0B1660B8DA8111899FD7B396FD1BDDA69E1BFCC097328579F597B0DA1226F93AEDCBE9ADE2B44FB2438E22D4FA4452C69AF0404FE971BC7C7453D28B5DDFD1E82DA5E6EE30FB62947E403551CE1F6EE99C356CEC8A4BA3BC4D742FC07D430A184E499C97AB32DD51732519985E94400334752DEDE6B34D77D5758B3439E019393CFEE20849FC239CDF079B99FFF21B338DE2657F174EA4EDF272F44E6B45A3FC4C8FFEB4AF4412D90C160BC23442FA08315E52A416EF72A05EC0AA3C197D53C7C46BAE403BD3BC0BD22427843F0930F59144D128E9E8324240139F804AA0C6B53BA94AABF13C6202BCF6F0D3F14426E53E784116EC16BB3E7A85137A8D635A064252707AC23ED2422549C480242C3DA583975AC429339519A94867020838E99F8BC7246F88B6389FA09C5C3B83FE1C44B6C3E6FF9620C6068884FA0D25CCAF3C8DDC1DAE83C3FF03F12181C966A6829485F0AAA0C5D60626E7084004EBF996DF42BB747C755D ct = 5D26E02F856531687416AF6091B67621D5EB23FB333A4747C210223D3F0704A59714416D3A469870EF9E4308338015D9492882425705C3CACE1EA61206654E0DFF951D1840D0993484AD35E33D350AFFCE66FB248DEDAE748E9ECD3BB32266075A9F8F3B4BC2A4C333BBA86A75E6918060C2A177542837F486A4909F3541348D5A53B3EA8C54C6538C1D3C2EAA0E00610E7E6F6A2A15C8DD1C8486482E64B9A75031561A7ED30B3FE0EE937C0D156124F05A9A86D847CE043F07996BF4505E8B09321403BB277DF82660C6095D9B1F18BC4D550702744A1B357DB980DD65F06E43464B1FCC31CF8C613C70D74CDBE10D8D435B0400B59A996D80B5EF97044023887B4432D79F0FF0B09AA4D402A94DB2162FD96E27B419425E4B520FCE1347DE9D7B272CFEC4FA4B4931E30672FBC4B737086082D55FCA3DB11F066110CA464F55919A696040195B0788364FD26D6B80D21EAE3E5EDFCFE467C83961DD8183E03A0ED2B11F9F0AB8000CA57AECAD0AA9EF02D20DB0B58614C7C7777A49FFADE9D112C95C7F7520821DC102A71FD3A67B2B8B96CDD5A41C05190E42082AF75F6B2D7DA32B724CC61DE53BF6ECF766E314AFD818D780556DE530C523154DD2AE4955028469160A12BC978AF13F0DEC9705C9BBE1938D62C75F533353A8C35ABA2AF43D21AA0D7AA88CA1FB1DC2EBF2EACE657EFC1747BCCAC43A7A940851FA80F21147BDD1B24F212F78B5DC9D4CD78CC21D774155DC2BC09BE65A2D335FCE08390A8E320BE675844B24B7C2D7F80FFE32883FAF48AE082F88A2A0A95E7C1CCD1C77D0CC62B569FC41C8502B154DBAC0DBA18E8844 ss = 70C15A90385D4C82B69BA40D21609F2C1A3E1002D1E65FC0 count = 2 seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 pk = 07C75180165FC1A44F09E22F2F17A7360953998E0E79ECA850E75972FD2424D7DE00EA5D4847EA22BB467ABE08831969C59B676A69A168103C42AD41B2FF058F413E84DA2393C918FE561B0E72FBC22AF14A3A1D173DA0B7D4D923E1FD24EB440FDF01D55958811F4A1A9F622CF720C4AA708D00A1D8ED1F65E948F2F89F714910C87DCF8A0CB2737A9760A5509596EF59B12CBC36F3752E797AD7ECEF35E93947F8EC4FD67218C4DD36651581B5015CA57E600A8484ED44DF9E0F607DACE55275D1707E42C20DBA8BD0CF06B0F1AF28C5D8EF303E31A4B54861A2881DF02446ACD8B84B6201CDED644C0976F45F6DAAB3BBBC40B5DA312288F952F873F362C9679DCCED9B643319240CAD5DE8E6E726A819E1CE3AEA427EC930DD878D96ACF6D37CF33A34B0601A0010497881C200C0288D5B7AE0AC6CD0BD2DF45464DAE862D941C726C70E6B9A309CEEB61E9454A325C02AF0A5DA2E6339468CC8A584E470A12BEC219B86DCB14313FBAECB9C2B2C79FF8E249B8C7B4A558760451507E095C211690909D3D335C8D376D190DEED632BE98E5B24C4BB43FD07D39296EC4E5E9429F4F564E6D18F212CBA119D8BEE6848E190FC8D9219DE1F6BA83AD10956B8586DB623BB4A5139E3E340024AAB7AB86564DFDD1B0968B03C24F2BC5DEB737D5D0F69E4F7FCC7E2EF6887D7EA8AE3CB410BA839A1873AAE9CA5556D6F4C6A8E8DADA11518EDADCD4DF7E63A3C05C4EDFCCBEA01A29EE7A9B9CA0B667726FAE70EC8B22358BDE935B6B1E6A4C72BC4A7E8FF6535 sk = 4B622DE1350119C45A9F2E2EF3DC5DF50A759D138CDFBD64C81CC7CC2F513345E82FCC97CA60CCB27BF6938C975658AEB8B4D37CFFBDE25D97E561F36C219ADEF716FB6E3CCBFD9ACEED34DB628D420107C75180165FC1A44F09E22F2F17A7360953998E0E79ECA850E75972FD2424D7DE00EA5D4847EA22BB467ABE08831969C59B676A69A168103C42AD41B2FF058F413E84DA2393C918FE561B0E72FBC22AF14A3A1D173DA0B7D4D923E1FD24EB440FDF01D55958811F4A1A9F622CF720C4AA708D00A1D8ED1F65E948F2F89F714910C87DCF8A0CB2737A9760A5509596EF59B12CBC36F3752E797AD7ECEF35E93947F8EC4FD67218C4DD36651581B5015CA57E600A8484ED44DF9E0F607DACE55275D1707E42C20DBA8BD0CF06B0F1AF28C5D8EF303E31A4B54861A2881DF02446ACD8B84B6201CDED644C0976F45F6DAAB3BBBC40B5DA312288F952F873F362C9679DCCED9B643319240CAD5DE8E6E726A819E1CE3AEA427EC930DD878D96ACF6D37CF33A34B0601A0010497881C200C0288D5B7AE0AC6CD0BD2DF45464DAE862D941C726C70E6B9A309CEEB61E9454A325C02AF0A5DA2E6339468CC8A584E470A12BEC219B86DCB14313FBAECB9C2B2C79FF8E249B8C7B4A558760451507E095C211690909D3D335C8D376D190DEED632BE98E5B24C4BB43FD07D39296EC4E5E9429F4F564E6D18F212CBA119D8BEE6848E190FC8D9219DE1F6BA83AD10956B8586DB623BB4A5139E3E340024AAB7AB86564DFDD1B0968B03C24F2BC5DEB737D5D0F69E4F7FCC7E2EF6887D7EA8AE3CB410BA839A1873AAE9CA5556D6F4C6A8E8DADA11518EDADCD4DF7E63A3C05C4EDFCCBEA01A29EE7A9B9CA0B667726FAE70EC8B22358BDE935B6B1E6A4C72BC4A7E8FF6535 ct = BD927B1C2AE047858330F98EB256497A38D034F2A857E7BEB989D9C8FC0B781BFB462065E600E14227C491828BCCAB0396C6C31CF957C3900A0CD97D220ADCC994D919EE3D7275DEC75F57917887D34F36467FFF4E7598281AEEC234E62F040730ACAFA2F8E58E7F34ED8B405FC0C0DB27E87D4D0553FA9468813937D6E1E7377643C07BACE463883B01A4E9638C3132205F6DFC1159273D2FDA8E8B5880FCDF550CEAF91C7EF7A4AD0D952B6F61707894AEE80EEF7853B3DB7A08442DCA4ED0D5770FE855B31B4DD4F0EFCA50657B6C5B45572B45CB35F6515EA679D44607E070092D708CD74B64734A97445F285A9FA9813F7A15E7A1E84199DCCE64B43B00FBAA5E78A8F6DE5F833D22235096375238D69E70080A14A4EA5FB0F3D5A13983CB4F80A02E15A2DF8F5B08CDDDD1F13A1EA1C856991A2B53984903901D88315E9BAAA1C02DF97FC9DC64B90D1E512CEAA58B522905135B996B7031BC06EBF63B23043204440738741C9DFAFAB90E86A0DB0020ABFAC5BC4ADCDF8FF286F659D573E7AE7FB28DBB2E7DB27E8BF71E85621C67B92BA3507441F9D8F9DC29C53D4E1174E4A671A9445EA847D8AEE3DDE54F8E09FBA1009FC61FDFC61593EE78774E315706CC78E05BA8073C1F0BDA215DED5F7128FBFD63264C45F998EDB51F28856C040DCA1FB1586FA87F76D3C466817972274E3CF6C002CEDABA12CCAB6CE2759D39524D8C865617F162236C50273AAE0910D21773C6F2FACF5598D62D67CBB862117497EEF3D1A41E698D53A97EADA4BE8E13069A573DDA9A3F48E2A44B6DEF678CE0CEC09F9755DC04A483EA78ECC26261CC62 ss = 3B62D33E7B4571484B09C67504F6B7291A7D1E31A9305258 count = 3 seed = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1A pk = 4B2C2AA0D99F58946F80264383658668C3E90593D8FE39126B39709B4B084542E86375E9BC31ACC9AF691BCBD1ABBE8168A07863E9EB1E9808A6E5C26B052BF53767B915EA855CE8B8A2D08E115071AB29A5B45B42B065711C3A43790227071686F1FD9FC0993535E800B96B7436A0C285D34863D2E91C497CAEF072F29C123F7D9450C77989DA42FC1945DE3C4C4B77F5489D959DADD655D7507017A8CE63FAEBDB4F0B7B9A8EABBFAA7E59474E759C2F7408646891B5AB833BC66424DFB4C9B6A4C52B5F199678B4D99F0E317A10AB773DBE63751F407829E39607B98CCA7E08B5865F53784B7FD674160C2462A8871834279F6F067289A19E686CD28E54AA7304F1FA4E4DAF81FA344EBAE440D0B4132E4086000917745A2ADEFBB07CD294F2879F028A625A0B8B9D9B6DD6749324522B9BA76BF0A759FD43F37D26F37925C73798A0D70584746A924B481B5A3DE88C28DEC74AC42FBD0F39F44AE3AAF0794AC62AA18224B2D5C8971467841539124339AC197685EC29A0FE674A5CAD7FE394044350FBA836F9585694B06C70BBAE4BB727BBE2DC07720055E66ACAC603A5D63D9B742A1841EF846F400D32A2416AB3CA514D432A3629E6C578CAF7E8D09CB0B67BB0CA02547A99CFEE0D68D600B0387581A16A14FE5192047B3D34AB3D321C1F4DA79385AD6F01B2000F75EE3EDC89777DAF28FBDD0053EC3B5FB5388FC60D9A1BA0F02D3E10BE25650F3BA08E5773D573A48D651F8DCB0660B3369E7E5EC03D21DC31C8B93BDF83DEBA78BFF04E18385632 sk = 050D58F9F757EDC1E8180E3808B806F5BBB3586DB3470B069826D1BB9A4EFC2CDE950541FD53A8A47AAA8CDFE80D928262A5EF7F8129EC3EF92F78D7CC32EF60FCA764BCC227C19F847822FD8FDF36034B2C2AA0D99F58946F80264383658668C3E90593D8FE39126B39709B4B084542E86375E9BC31ACC9AF691BCBD1ABBE8168A07863E9EB1E9808A6E5C26B052BF53767B915EA855CE8B8A2D08E115071AB29A5B45B42B065711C3A43790227071686F1FD9FC0993535E800B96B7436A0C285D34863D2E91C497CAEF072F29C123F7D9450C77989DA42FC1945DE3C4C4B77F5489D959DADD655D7507017A8CE63FAEBDB4F0B7B9A8EABBFAA7E59474E759C2F7408646891B5AB833BC66424DFB4C9B6A4C52B5F199678B4D99F0E317A10AB773DBE63751F407829E39607B98CCA7E08B5865F53784B7FD674160C2462A8871834279F6F067289A19E686CD28E54AA7304F1FA4E4DAF81FA344EBAE440D0B4132E4086000917745A2ADEFBB07CD294F2879F028A625A0B8B9D9B6DD6749324522B9BA76BF0A759FD43F37D26F37925C73798A0D70584746A924B481B5A3DE88C28DEC74AC42FBD0F39F44AE3AAF0794AC62AA18224B2D5C8971467841539124339AC197685EC29A0FE674A5CAD7FE394044350FBA836F9585694B06C70BBAE4BB727BBE2DC07720055E66ACAC603A5D63D9B742A1841EF846F400D32A2416AB3CA514D432A3629E6C578CAF7E8D09CB0B67BB0CA02547A99CFEE0D68D600B0387581A16A14FE5192047B3D34AB3D321C1F4DA79385AD6F01B2000F75EE3EDC89777DAF28FBDD0053EC3B5FB5388FC60D9A1BA0F02D3E10BE25650F3BA08E5773D573A48D651F8DCB0660B3369E7E5EC03D21DC31C8B93BDF83DEBA78BFF04E18385632 ct = 7CF6FE51A29C58A61F602648B9D3D3DF1A4B02D5579C7AA9BE4DDA129282F4CD6BC058781290A4FABD9C5133AE12C95FEE731E8C0561CDC5FCA9645ADC33E9FE27A87E13300208E123FABC6AFA7268B795F1835A75DE838C2F53AD0F496DA553276A539A35B20B1375BC1B7653C933C8F4141A1ABADC6D14424F446D4EE42CB2FCD7B6EE6C54C19ECD2D86DE72A69A2262DCEEFA6E529E3886CF577CA257D3471EC4F22366090BF2086D90CD3B61463D69BE40CA553851A78C457039F8253A1F3AD020CCE779E5A338CFDF84AEC0AA54D08BF942F99EA80D9F7D6EF4CF346FDE0469939261BC22366DC6D87D870BD08B5040B251F084DACD0F576940AB0D819C823435892163CAA70D641182196B8B520EB7AEF55CD777722B412B33DCD391E990E0B4B797C5BB363C2A354D88DEE067C064431C7EF23A56BC1A4135EE74EA6C0A8F2C812DBD5966DD13C83FD9C912B5FB262ABF91542D53CECBB0B1A2EC21C2E43840790FF1388614A9A070AAC0893DED85E3D9C966543E6B2EAB3B954B26C42DA79EBDE88A09C52E3252AFEC4829809F664ACCD3C2EB25B243ABB71A07FC02741177E76D50D221FABAC4B15F61B60C22B98474B5D443DFAB155E2FC7BBCEF7FB0FFF277F69CDB667DDF299A94296D217D02D9A0360F723336E8BFFBAF0435DDF55B30C599CCD8B14EA034BD2255B51C08C3B18C1EA2695E13FA028A2E7F9AC4790DDDE0283EFB21BC077869B77BC18AE4441FC8AD89A1F012B0BAD1B379D0968651F373AB1B646BC70F0FAED4358F625B2C236614B27D3EDF5B82EA7AF3AA0AAC6B7D16850AABC5B25B23DA749AF32C25930AC ss = 2167B2E394F095D7B2B94CA405DA04F6E0B3DEF864D90D04 count = 4 seed = EDC76E7C1523E3862552133FEA4D2AB05C69FB54A9354F0846456A2A407E071DF4650EC0E0A5666A52CD09462DBC51F9 pk = C5A9C23A3C86F6B79975F2009B7BA6CD248D3244784056BFEB88D4328DD28801126E41188823BA401EF37BC4CC53024AC1FFE348C9D568E054982317C1583CD14565866F49C1A3F7250062DBE374B59D82284CD529304FDF808BDF8890656AA3621E272DD5F707A4A68A56EFC65143F6066D0238F2BEA89D7019FA383BF5508303A2AC8D23ACAB998D67F51C438FDD88654BD1A2884EC50AE61B4C51807AD9BB20A1F3DF3803EC3D96FD63EAAADC4A542AC3490ABA2070FE31E2CA58A8CEEFEB557340321180AB46EDB5AA15CEF5D1BC1558B17BB634A61D209C21BD1C84BB563A9419593C5E8547F19A5E93733CF7AAA422339AD8EE7D260B58D0DD17824229C25AD3CEBA540D5885F0F0392F189764ABB56734327FF9E44D13AE856AE049B74590192C40BC0DCA7A2F13149BAA07CFA6AD2A42119619E5C5D2C8DFA6DD14180A8276DCCEF5F0F01218BC16154A3F14E7DF3CD525B0086BC507ED5E6CC273FFB21B2C1E29FDEC6974B5619284D80622C81520A9F18CAF2B29ED4B05CA45740AE2333ECDE6630BAD22A38851FD90473BB846B88BCC59303B13CC97A813ABA9C7FD07798BA49AC4F7A217B13A832AC6F2628D8CCB3AAD9E9E2FE2FA5E02DCBE25A26340EE3312FA0A003F00EDD3255766A468A2A6596B33079A303FCA5F1E84EFE7043E0E6A7D153469D394064CDFC35B5507136C33D1B68DC2D11513721ADA02849845B0C68BA613113901CD4DECFED2AB774C168AB17191BE8DC209B87DF38DB8E8915545E2057B4E6DD5EF4C4AF843FE9D7E32 sk = 66B79B844E0C2ADAD694E0478661AC46FE6B6001F6A71FF8E2F034B1FD8833D3BE2D3C64D38269A1EE8660B9A2BEAEB9F5AC022E8F0A357FEEBFD13B06813854019994AA948403F5C1BC1B3BC92E6C01C5A9C23A3C86F6B79975F2009B7BA6CD248D3244784056BFEB88D4328DD28801126E41188823BA401EF37BC4CC53024AC1FFE348C9D568E054982317C1583CD14565866F49C1A3F7250062DBE374B59D82284CD529304FDF808BDF8890656AA3621E272DD5F707A4A68A56EFC65143F6066D0238F2BEA89D7019FA383BF5508303A2AC8D23ACAB998D67F51C438FDD88654BD1A2884EC50AE61B4C51807AD9BB20A1F3DF3803EC3D96FD63EAAADC4A542AC3490ABA2070FE31E2CA58A8CEEFEB557340321180AB46EDB5AA15CEF5D1BC1558B17BB634A61D209C21BD1C84BB563A9419593C5E8547F19A5E93733CF7AAA422339AD8EE7D260B58D0DD17824229C25AD3CEBA540D5885F0F0392F189764ABB56734327FF9E44D13AE856AE049B74590192C40BC0DCA7A2F13149BAA07CFA6AD2A42119619E5C5D2C8DFA6DD14180A8276DCCEF5F0F01218BC16154A3F14E7DF3CD525B0086BC507ED5E6CC273FFB21B2C1E29FDEC6974B5619284D80622C81520A9F18CAF2B29ED4B05CA45740AE2333ECDE6630BAD22A38851FD90473BB846B88BCC59303B13CC97A813ABA9C7FD07798BA49AC4F7A217B13A832AC6F2628D8CCB3AAD9E9E2FE2FA5E02DCBE25A26340EE3312FA0A003F00EDD3255766A468A2A6596B33079A303FCA5F1E84EFE7043E0E6A7D153469D394064CDFC35B5507136C33D1B68DC2D11513721ADA02849845B0C68BA613113901CD4DECFED2AB774C168AB17191BE8DC209B87DF38DB8E8915545E2057B4E6DD5EF4C4AF843FE9D7E32 ct = E0BF4BFBBDE0A02A12A82F5F78EA9C468041E79A2117ECA1F8F9382BBD8C0C55517E7A985885B3ADD3B147EEBF77A6FE1AE81A96EEAC5F9BA2B7DAD58D2DBC8D194B01437FD95FE3838CFE88C84FD7969162C892DB6B982639AEBE2F54693F7393058FFFB41FE0EA33E8559C3A570100A41912228746D6B0C93261B685539251CD6FFF8D5F19041D7F4592AFDC6C5D251D94C622E2D2AABF506482D9AD4D731B50A5987B5D505B3340E22D38B673279DA01BCE801651542836375B650948BBC5853C9ED61D20A8A5027875A38AE46522E648F01B67A91F0ECFA9732DE667B547781A810B47E7FF1CD367E1FD27830C0F345C997CD030E80368542248264988C25D8B7B7F3DAD0D2202B4387C211D8AE79C77513BBA72F84C59571C8AC8335947A5F57918A0511171BE7682B233FFD1FB8797699181FA77325A5A139C891F290F250C197FF7994BB8603195780AB1311C535A9BBC5D9290AF768B67C3F04D9AAF75BAA889A6DFD54A5F8092F02B426A84F354ADB7DE66EA6B08C64668F86A7921ED95A4A23D9662C239D307484892CF633E54E951B731ECDA2EF17DAAD5C4B0BFDF82BDD7015A3A5500585D1C49CAE21BA1E30CEE6D3402F2EBBBAFBDB0053FA84CE9DF1330D5711915D57C04C20379248828A714953FBF72BB161F29D942D7BDDD03FBE242BFEC583752D13B520785AC1625988FC6930A31D714B78D5F7DA3AB0BDD1656D01C700EEAF0DDE2609DD2E7DDD1E526D534AEAB6E18ED577052CA7FBC117209A4B32DFB2735474CBFF6A87885C312012E9A2A7F2E0781B74595365A11243F62A8AA50834AD701A03DD636BB7502EFAB ss = 4899938248FFAAA765012343720D0C4088846053EB5EC438 count = 5 seed = AA93649193C2C5985ACF8F9E6AC50C36AE16A2526D7C684F7A3BB4ABCD7B6FF790E82BADCE89BC7380D66251F97AAAAA pk = FBFF32FBD52BE1A79DAF6FD0771D5D915C74E146B84B5F218035866EE37ED8A6D6BC623D1BC1B786FC9C87EC77F78A278B91EEE329E21672E3FAD834644A17CADD905DCC6B84C71577DA49D2603A4E3F2B5BF8DCE5D9E0D2F5D34C9AA85F0ECEF429ECE5899E585F8FC255C8C18865D5617E66D73D5BB335129958C5F57EE3938823A973E90E37961033F7889FDB6266A6F674D4EC1CCC320B20FB9202509E292453911676338872CDBCE22D04A6B4DDC63160F6D40B8FC816E80344F12C7A14624BDCE9697F9506B3F3DE3A8EAC271C2802E0095BE987D76C9FF1367147434D3CA2C6983B10CC16DE898E2AA1A1D79F3BB0F4E73F887334F5C7F911976F2B3E292514E873A8237C714BC14FE02D170CC70D39C35002BB68460348EE6FA0A138EF90226CBB6B775A27578CD40C55754622B57059E59486625D4FF9EFB8CADD0B2D074E305A8BB1DF93C557F3367968BD91E4CDC64E9E6E6E61B9DA607A44EC2076AB0D544F522306E6EF63E10567F310582A75AA6872462D0ED8750E1F795B7925E6628F5BA936AF428D835D7E8E665998DAEEAEEF9FF8A8D6358B0D08501792BE24BA21FEC8217360A5C0E2904DCF416C3799BC9CE4FBAEC2B653BD06379E42DD9BD2C121C13418355500EBDE9149145859C8FFAA3DA649197623767F85EB9463E336A7D4263189286529C37582B45DA2313DFDB664CC4A36A9A6512BAD5CF62DC9D5BBB184DF1F9AA0F70F9712679ADA8A0EAC68EA6DB296B665B893E40DCB820792850A531CC64A81D0F452EA3D3794B2B30B sk = 7EC408F52C9AA723D0C41D9987682A5F4CE6C9DA7CD0215AF60BBAF5484AB353A08CCF451B049FD51D7A9AD77AE14A81569DF8C9BD3A8F1EBEA86FDCFB823082575E0CDE12B4B3A846F639EB82204901FBFF32FBD52BE1A79DAF6FD0771D5D915C74E146B84B5F218035866EE37ED8A6D6BC623D1BC1B786FC9C87EC77F78A278B91EEE329E21672E3FAD834644A17CADD905DCC6B84C71577DA49D2603A4E3F2B5BF8DCE5D9E0D2F5D34C9AA85F0ECEF429ECE5899E585F8FC255C8C18865D5617E66D73D5BB335129958C5F57EE3938823A973E90E37961033F7889FDB6266A6F674D4EC1CCC320B20FB9202509E292453911676338872CDBCE22D04A6B4DDC63160F6D40B8FC816E80344F12C7A14624BDCE9697F9506B3F3DE3A8EAC271C2802E0095BE987D76C9FF1367147434D3CA2C6983B10CC16DE898E2AA1A1D79F3BB0F4E73F887334F5C7F911976F2B3E292514E873A8237C714BC14FE02D170CC70D39C35002BB68460348EE6FA0A138EF90226CBB6B775A27578CD40C55754622B57059E59486625D4FF9EFB8CADD0B2D074E305A8BB1DF93C557F3367968BD91E4CDC64E9E6E6E61B9DA607A44EC2076AB0D544F522306E6EF63E10567F310582A75AA6872462D0ED8750E1F795B7925E6628F5BA936AF428D835D7E8E665998DAEEAEEF9FF8A8D6358B0D08501792BE24BA21FEC8217360A5C0E2904DCF416C3799BC9CE4FBAEC2B653BD06379E42DD9BD2C121C13418355500EBDE9149145859C8FFAA3DA649197623767F85EB9463E336A7D4263189286529C37582B45DA2313DFDB664CC4A36A9A6512BAD5CF62DC9D5BBB184DF1F9AA0F70F9712679ADA8A0EAC68EA6DB296B665B893E40DCB820792850A531CC64A81D0F452EA3D3794B2B30B ct = A709B6CEB09E231BA1634399171C78653D53FF7DF5BCEDA59F5428D1890B6F9878542771EED3EE1BC5EF0A2030B0FCF092336D52B52E94ABC96F9A3726BF7306483A8F4657E79238A3FD82E3FAAFEF6981C760ACEC51B6DC6AD4E5E8F62EB9D0C49FD9C65FD2F25E79756453082028F41542BC2FA473C7C9F2938DFA151DF5729B999E8C2D1A91FEE5AC9C5DF99EB3EB60176AAF96A7EBFDE8C223987BB699995994C962153AD3489E6AF98574DFE8E9BFFCAE4997718EB5FB3C884FE9087C71FC54809B3BB34D5449F6060CFF2165FF5A9DCCEFA56B9AE51470328FF2935EB24074AF75E3ABC801BF71111BFF91BB21BF9797953B8CF98C992367CF5FDC4F6CFCE1580CBC2B4257DFD4603FE3679B0FA4989703DE51680BDE3334C9B3E8E3FB388D7A10426F2117B08B0E8683D3E9A5FCC3060FA748D2670E2F108980C27CCDBF5688141AB32F3BDB315CA68E5A57A884F31BE6890154A2A18860B230BB7A5EDE5605D152F529664A9E47269B1B4842E24117DEC68DCE012C698C652F26EC51B9D1914DD31C5D0E68D23E7FEE8859B11F35C04C746C7A93841B07D9EBEADA15EB2EC90054535BDED9C5B7A402E27DCBEBC8535D87D51F01DFE599984F26C9DF3D3331964D45CBCF59566D2BF80AB8C8EAF1FED13420C550FD7AD9FC3A9044FF23E821A0B4BAC82205ADE0826E844D21E32744C1F272D0D93A880B233CE870A8A592E4904FBAF42D6512DBCC41CD87D90DA84996C1833660AFD298DD01A8800F634C5EA5EFCF0CDA7D8EEFF1CA6360D0C45CF61B25A4964327275E84A4BAE274CF8ED2AA65D4EFCF3A8C95592DDABFB47C795957 ss = CAAD9C4C75D9E7E6AC744D70B5F8A5BBC8D911E4BCBFEA03 count = 6 seed = 2E014DC7C2696B9F6D4AF555CBA4B931B34863FF60E2341D4FDFE472FEF2FE2C33E0813FC5CAFDE4E30277FE522A9049 pk = F847D83D5BA91C37185ABA06751309B1C7C3FBC3C0A6D08E92DDB83310166D81B104F4C9552283E8CF6AE3F6828C5A9CA260F915A55BFACE5590E019D81855D1888F500F562C84903B7430347C5A7147BFE107C2179996D918538361C9624E82F95CC6F985099C10A71BC4B547666749CBC16BCD1857B1513FF3FF4B54A7D2A7B7BEF57755B62B23280330744BEEC0D8738968FF066BE1C9144038FB10A226B43C8C2E3E2AB36C4B8D9076F8BE975151DB7E9E8760E9676FEEBF7A17A882F0FA9DF02E0AAA3AE9F66346B4DC73FF037B055BD32D5434017D11A9EC0839776154EFF5E3F85E1F77B7E727139ECC8E2D12C88722CEDF7F46EBAA62233044917AA64AC1E4E9ACA850895AEE22FB8A77E00D3BF8FA444E29735E332CE7BC544963478352D2EA5A4D2B1B4C2BC78A56D72A6AA5B07F2241EBE9B0A2606F75D4B8C6F746E0A0A5DEAB8136A70E5635E4FA8BCAB08C7F6548AB553592ED2FCEA8A7950AA2F10CD501AFA71B546591807BA6973A5DDB6FAAA269F837528C065B2AC9EC9535CAA4BF55579B9A8A2067A86ACE05152BD90EDC19E5E062B659011A37760ADAEEEA05935A94B869F9F7F99ACD73BED6FA345B94E69F4566996702B71FA502070FA656C98B2E4BA4F7A4609D3D2199B46A01B5760156ECDEE4703A0E4A0EEDE096CD1ADF2F73F89CC33CA67F8C5C88C92AC0575D49A33FEBA00C66AE0E3372B5A5E52CBA4CFDE654878E512E16FC7DB7A467A6EE5ABEC984D98C1E87FB2D239AA3F1B99B62BA57D9E811B72E578A087ED9C51D1F sk = C121915BFEF6ABDFC177DAE2F5A24218F9ABDA2559AFC6741B08E0E61AB433EB84EF52DB5EAA6DF8EC3A0BC5FFA730DB0DDE8C5F38F266D5C680A78D264A7B9633D9228485C117A4D4C78E14F0C54803F847D83D5BA91C37185ABA06751309B1C7C3FBC3C0A6D08E92DDB83310166D81B104F4C9552283E8CF6AE3F6828C5A9CA260F915A55BFACE5590E019D81855D1888F500F562C84903B7430347C5A7147BFE107C2179996D918538361C9624E82F95CC6F985099C10A71BC4B547666749CBC16BCD1857B1513FF3FF4B54A7D2A7B7BEF57755B62B23280330744BEEC0D8738968FF066BE1C9144038FB10A226B43C8C2E3E2AB36C4B8D9076F8BE975151DB7E9E8760E9676FEEBF7A17A882F0FA9DF02E0AAA3AE9F66346B4DC73FF037B055BD32D5434017D11A9EC0839776154EFF5E3F85E1F77B7E727139ECC8E2D12C88722CEDF7F46EBAA62233044917AA64AC1E4E9ACA850895AEE22FB8A77E00D3BF8FA444E29735E332CE7BC544963478352D2EA5A4D2B1B4C2BC78A56D72A6AA5B07F2241EBE9B0A2606F75D4B8C6F746E0A0A5DEAB8136A70E5635E4FA8BCAB08C7F6548AB553592ED2FCEA8A7950AA2F10CD501AFA71B546591807BA6973A5DDB6FAAA269F837528C065B2AC9EC9535CAA4BF55579B9A8A2067A86ACE05152BD90EDC19E5E062B659011A37760ADAEEEA05935A94B869F9F7F99ACD73BED6FA345B94E69F4566996702B71FA502070FA656C98B2E4BA4F7A4609D3D2199B46A01B5760156ECDEE4703A0E4A0EEDE096CD1ADF2F73F89CC33CA67F8C5C88C92AC0575D49A33FEBA00C66AE0E3372B5A5E52CBA4CFDE654878E512E16FC7DB7A467A6EE5ABEC984D98C1E87FB2D239AA3F1B99B62BA57D9E811B72E578A087ED9C51D1F ct = C957745386D94B2EEF113EB1EADD2EEE26E05565884C3F0E353A01DA4580999DFB10B81ECBE809084676EE51FF083248C1355300A89BD7F5D8B14A492A7D0442EBC0801A3150AB860C92F5A3A8378AD0632EEA1EA120E1ECEF2A0AFDF969381BFC8B0FF2E517BCFE7419A6BEDA94B7E83F4F65152EAD55B7E8171568973D75341C14333AC4A02456261A2350317654EB1538E0BBA1455019252E52F0CE1A2F60DC048912F723CBD75A3DC6FCE688BB7708F890C7695B2122D63FDA08F1173B4CF17C815A8BE814C49B7B9C3050B22217E7C611A759C03D40261460A73594A953B1B416490036EBD66A4DF77505E1A543CC9A8C2F84E3FF0FA544328090FA29DFE5DDAA0B5B47FA1BC845114429ED243529FC0B60887022DC8018B3A633894C99B498AC60D3FDD0DEE031521D87CC378CE12A1CADE104DBEEC5297360ED5F14CBC519DFAEF6296302EDDA582B93CD689C45037FE98BFA830114792CC447F789BEBE60CCC06FB3F2F773ED31DDE91503650903F6C54A77692E23A241099FBC833F70044A2EF3B7123321E212493E4AAF245369633FBEF0B5F7F8AB9FB7132DB16E0C20921861D843DB8A64B9F25E11D38063F4B6033FA74B42BC87A6733B6FA4B5B04BADA91F3524AD4FB67AD963905890A034A636775558F7EC0969B10820F4855FBF64FEEBE916461A0464F0275314604E0AC7937926D335D08A0A54639B464B39C5608424B138437F83BEC977A8153F90E1E661F1192E801D6B41AD2FB357DB3242E72E5A4553C7B0FBFC83E6FFDB4A9DDAF9623F787647F8F5A7AE65422458FFE022F4A13E6E67733005D3020F581022CF5F88 ss = A2EA4C2E8DC4B7548FDDCBE214DF944B0D1E9FB773D24F98 count = 7 seed = AEFB28FDD34E0AB403A703B535296E3A545CA479C1D8148E2D501B3C8DD8B1034BD986F13F1A7B4671BE769359FD2AAB pk = 62D6677A1D67455E8C014C582B8C237B14B6C56E628A42017F33C2383B56A9FB3EA08576A6C82D21EBD968C85B9C9056E661128D886EE585B59FB3522ACF1A210A33B5BE3919971237C1E7A86161F500D0ACD7B6E21DE2AF533611D4D2576355DBA58AC14AB2474C77741827EE86EB04733A15DD5816532D46892197EEB70FDB9B8D244CAC0387B50CCE3C2343F1815B5C26260B27A5974D16AD629ABCA6B1874A6C3B448F7655A9F10A8B5A85F9605EA0D6551C1F7DC74FC06DDD386ED5395E57679D60A5F79C32B6BD135C892460F873BCE412A735B3C7E72D55D5BDB2134029A713ED57883BDF7E624AC595DBCFA8B792B40155F0F6DAD5BB729B13A5A75B424D55E98297F14A06B268CB172DFD54ACA53D508EB30CC4FF000A898A55CD25FC1542E613DCB0547DAC726F03F6247A5F44AED68E06BC00BDF045FCEDB7E57CCA2054B5DCA31A285764C3750BF75D427664FB7B18AE7707852CAF01FCA685007E221CDB055385FBC034695B639CCFAC239BC61FF93F3C34ED51EC4FF3C68A70331A0AB155EE3B0F704735EFB149DE759EC2647B2823E72B89451B3FEAE240CAE95D959EA1B9191A80019CFD62E55F6B7CE86B940C90479002AD876A438FBE78D48FDFEB09962E642862D2B1FA5F356AB0738CF68F295EF5C4E5E6CA1134738A293E4333CD8CB5DA8EE812FC86EB0F8BD9D769B30FBC247B31C1877D0BDC69FE8BBF4FDCEA8736B192F4836540FB880C5772A9F426F0B56A470864B5E2B11AFE5F71E2DEB93A54C9C3D39281B980D7CAC8F21009 sk = D86634ECF96CC2603761E284C0E36734CEDEC64E7FF486469E38539C71141C5A99DAF37400CFE59841AFC412EC97F2929DC84A6F3C36F378EE84CE3E46CD1209C584B1AC41A0F81C33043A9F815D8D0162D6677A1D67455E8C014C582B8C237B14B6C56E628A42017F33C2383B56A9FB3EA08576A6C82D21EBD968C85B9C9056E661128D886EE585B59FB3522ACF1A210A33B5BE3919971237C1E7A86161F500D0ACD7B6E21DE2AF533611D4D2576355DBA58AC14AB2474C77741827EE86EB04733A15DD5816532D46892197EEB70FDB9B8D244CAC0387B50CCE3C2343F1815B5C26260B27A5974D16AD629ABCA6B1874A6C3B448F7655A9F10A8B5A85F9605EA0D6551C1F7DC74FC06DDD386ED5395E57679D60A5F79C32B6BD135C892460F873BCE412A735B3C7E72D55D5BDB2134029A713ED57883BDF7E624AC595DBCFA8B792B40155F0F6DAD5BB729B13A5A75B424D55E98297F14A06B268CB172DFD54ACA53D508EB30CC4FF000A898A55CD25FC1542E613DCB0547DAC726F03F6247A5F44AED68E06BC00BDF045FCEDB7E57CCA2054B5DCA31A285764C3750BF75D427664FB7B18AE7707852CAF01FCA685007E221CDB055385FBC034695B639CCFAC239BC61FF93F3C34ED51EC4FF3C68A70331A0AB155EE3B0F704735EFB149DE759EC2647B2823E72B89451B3FEAE240CAE95D959EA1B9191A80019CFD62E55F6B7CE86B940C90479002AD876A438FBE78D48FDFEB09962E642862D2B1FA5F356AB0738CF68F295EF5C4E5E6CA1134738A293E4333CD8CB5DA8EE812FC86EB0F8BD9D769B30FBC247B31C1877D0BDC69FE8BBF4FDCEA8736B192F4836540FB880C5772A9F426F0B56A470864B5E2B11AFE5F71E2DEB93A54C9C3D39281B980D7CAC8F21009 ct = 334BAD6A78514EE684DDE43F290FB0440185E49D83923A619425DF140B95D929A23B86D8960A0775926C2A76BA420C9B45CC628745D70DD51BDF2EC4C1ACF1A66E260329D301C7BECBF390A5BF2CE288D53473E3F360557B1CE78C7BFD52024C80ED9E1CD5A3D6861EE339B1B84EA211BD41A5F2D0D389E0FB1B6EC96DCB3199CFE60CE1327E6ABA8FCB5041A499EA68347118B5F757DE52D1CFA9133E9C4071223D7BDB9D492435E159DB812235513D15115D11A9CD107E6AC19D239B3511DA239926292C1FF5AB223F4C1E29BCD1E5C69CB4DEC91EAD10EA64D5F4EA71A9E5A28D87B7BF9F485A2D38B6DBD09CBECD2397D05FDDD0F391228C7E47B32AC82C38B74B6DD5FB0634C0A28E369D16A88364649CA6840354425D098065BE4B5E48EA128AB2299BBF7DEF6B981DE252F0E7CCA5995AFD5A1A055BB7794023AD032AFF9478F5A4A07AE83ECF473727D9B61EF1C438DB4EF3C019BA2539F315AAD30BBBAC4176F94F940DB9D2CD1777883BBDA3DD33D9185EC64CA8207F64B040627638EBFE803C609BF859CCB13EE461DB73617B82BE38141985C2D72F4D4102CDDEE42DEF24F95A5304644568803318168695DD4D898A8758B38DC2AAE2740D892A105D93E77E9F02865C23B76784EFC3F2D4AE56714E09B947916881B271A5416E930EF95DD4602A89C72ED6563C04499F1E368DC988E32A6FC88ACD1DE79E6D80EB7FC431AEC40A95AF1C3E11F71E9A5F1FB3F3CEDCE46C7FEF120D7389AFEBEAA98CCB503C82C49BC55F4C3994672506D28B1E61BACB902858B02D09D92402D85A9FC73123581F45BEAEA0CFD79362FC632C23F2 ss = 82B5164AB4D6E5BC7DEBA0390D9AC94F6150147371E83AE1 count = 8 seed = CBE5161E8DE02DDA7DE204AEB0FBB4CA81344BA8C30FE357A4664E5D2988A03B64184D7DC69F8D367550E5FEA0876D41 pk = F8230A69DD6FF2E0FB4FEF0C49BA42589BB10BF8B954DDBFD5176F16EF7B0034751D1B0ECA53716F61B0AF0C6760965F3E7CE712B4D108DE4A24C3F240F38A4744F4CC327E54C5184CE28A80116B30866A28F7489F57C0F09E41A4B83C59CCBCE3F071A0AC711F3F8BC83F0EC0B4DFD1411077C9B178D4751421C3BDB4521E9FC1441358F155E280EE76DDC197962F4352BF447978EBDAAA650CB8358EB0F97CD69C26DFB08D1B9AD5F843BFEF3A39DCFDA8322B369AEDDD2899033CE5FB4EA8F4642FF4045E960B17B23A2D9C20878FA148476D10F90B18182608DAD8C9D58D5AD0F50B4AB6DDCB9CD6E7ED3F75912A5E0006F5BF8961AA362CF1CD15E9785790CE24CA7CDB148B33B66BC5FEB637660E90F9C54CDDF3EB7745EF5E87C59039748A1A8912EF4E8DF080C1E39479BB04DF7188EFB8E101853F29E628FC2032A4F39D68A94954AF62F7F20E2E329486751B1963E72E711EAEA8310D4F1A117A3510EC38179BE52C82D2463DDED7FC1AE53511EB29667A1C40BE2AF484204B46A999C05F45A1308DCD4CCEDF7CC7265A623B2903E069B9AA9874856E7FABB20B11E1B19E4601ADEFE114CC33FF46B02B3A4F34AC2974CACA365C673C6D6FC67DA1A60F8F5117F99C22670C249ED9245101C98F0A9B686A431B6F344EA6A5BFF881E703B902502F9E53169BE63752EAF2AC4449E8ED5CC86258671329D74E64E689206F451DCC3778EB5FBF6219A5B8D63ACF8CDE0025D27CE496E0BAE99E52CEA8A2DDF0A585DEDC5129E23EEB3A5B9D4CEB8AE56E sk = 0610678FF4DC3128E1619F915DC192C220F8FAD94DA1943B90AAEC401683A492DA1804DDB5AA9B1C6A47A98F8505A49BAE2AFFDE5FE75E69E828E546A67710049BB97233D6B26DD19845A98D1BABD200F8230A69DD6FF2E0FB4FEF0C49BA42589BB10BF8B954DDBFD5176F16EF7B0034751D1B0ECA53716F61B0AF0C6760965F3E7CE712B4D108DE4A24C3F240F38A4744F4CC327E54C5184CE28A80116B30866A28F7489F57C0F09E41A4B83C59CCBCE3F071A0AC711F3F8BC83F0EC0B4DFD1411077C9B178D4751421C3BDB4521E9FC1441358F155E280EE76DDC197962F4352BF447978EBDAAA650CB8358EB0F97CD69C26DFB08D1B9AD5F843BFEF3A39DCFDA8322B369AEDDD2899033CE5FB4EA8F4642FF4045E960B17B23A2D9C20878FA148476D10F90B18182608DAD8C9D58D5AD0F50B4AB6DDCB9CD6E7ED3F75912A5E0006F5BF8961AA362CF1CD15E9785790CE24CA7CDB148B33B66BC5FEB637660E90F9C54CDDF3EB7745EF5E87C59039748A1A8912EF4E8DF080C1E39479BB04DF7188EFB8E101853F29E628FC2032A4F39D68A94954AF62F7F20E2E329486751B1963E72E711EAEA8310D4F1A117A3510EC38179BE52C82D2463DDED7FC1AE53511EB29667A1C40BE2AF484204B46A999C05F45A1308DCD4CCEDF7CC7265A623B2903E069B9AA9874856E7FABB20B11E1B19E4601ADEFE114CC33FF46B02B3A4F34AC2974CACA365C673C6D6FC67DA1A60F8F5117F99C22670C249ED9245101C98F0A9B686A431B6F344EA6A5BFF881E703B902502F9E53169BE63752EAF2AC4449E8ED5CC86258671329D74E64E689206F451DCC3778EB5FBF6219A5B8D63ACF8CDE0025D27CE496E0BAE99E52CEA8A2DDF0A585DEDC5129E23EEB3A5B9D4CEB8AE56E ct = 3FF09A1A538B9148CD8B94507F5380D70D64AE8FEECF9E09A20D28AA5A6A39CA9D9E435ABADC51EF94AD6A81DE31B7BCC43F0220348D86F7E4D29F68F46B8470E771326F67EB2764562E48C7701ADDD3714D3BC0CBAABF9DA30B7713963F2F58726A7D8487D9FC42D631096EC0517BD49FA2D4826263A82164DF3B72E11F6BBD59F1E90181F64D2C70343DB9CDBE7A26678B4B66308339F7B5E2E9DAF0D949C8B2DA33158470DD13B4331A641A8CE938CDFC0478CB87D7424F29352B3FFC30052D7C2F669DE702B110592804CF3311DBC4435CB80A9CBE0D123ABF8651F96CC0CE833910A416C67756983C6821D988992554F8506851126FA3664646BA257249CE23AE31BD787F6E84DCFDCB8F223C9757F12568A837B8E3010FFAF0731BF71A68264D203D3CF675184F499097C57E282EEF3B36A4F8C90CE3BD94C8B128D609FF3545732A417BCC5260D52C1E530F489B5A6B8AC58423F81656F111ED3A92399620BF97D299797F301B57C4AE7A9232C64378E9FC096D50078D4766E9FC72A474AF4A9E5D579F31F2DE88191D4F30D61C1706BBE12599771783E14094E72B203CD89CDF57BB5FE76F6356D7ED86055CA6CD02513C8AACF7C54C55F6B4E56ABCDDF569113E96D468CE39CD84BAC4733FBC6D8B09574EA39E6C61BEF8FAA355551672BA2D773E526B34525AE421461FC896232A8519EF499DBC4209C2F35CFF375085B9E0BEA86FCFE61B80C12A7135709AF20219654F511CDED71BC236462B2AFF2AC5E3EA9BCDC0D73B8FDAFECAA327D9B66040DEE0B39F52CB1F78EF7BCB13A567C1A60ECD9751DA23D855A61126281544791E ss = 9A500CA52CAF4EE788590A25C142968C0B3C1CE53463EC54 count = 9 seed = B4663A7A9883386A2AE4CBD93787E247BF26087E3826D1B8DBEB679E49C0BB286E114F0E9F42F61F63DEC42B4F974846 pk = D87235B65F09DF1D7FE1E3250E78AEB2DE11626C493E9C1748A50A3CDD40F2F4BC2030F509031E34DAF7E776927F1123C028A83A45C2E999D768FAFB1512A092B8B2F43D4CC04A2D358F659BD16272897318651A4BC835AA08AA725E153C8A3CE54F760DC4C4759AD30E08BC0E880245E5E0F6CBEB7C2A9EE1705BA442B564845AB83D769BD7CE4FF5A0AEA098A7ABB50E9D82856F137F733D638EEB4BCF0427EAE3DB6A4C8FFBDB13E68ED1D1022256CC1E4A25C0B4B670CEC0744AACF8AA6F4A29BD4C3FEF084D76550EEA4AE53DDA22D91A7E1A40A6F88B7ED77622590D0DBC22A2DA1AD6E9F11C7866BE084F376D096BA484F2B83A376AC49E8D38985F6B866FFDEA4A010B14600A2826EE7BF5FEEA25AD4BE39FC50EBF630188ECE9A4B024E6856B58A86B1A1922227937A94445B3F6C22656DBDE81CAD22F33DF50D678F9663D667CCA262A8EAAB9FC045754CAAA85B5F0BCD702C534B0A03D42163A7730A59C683F823C17216D0B7FF861332095CBF483BB29AF36DAFB9E784A548DC1EBA7816A4255E588039FEE28FDDE06521665E35DEB60544E8DED205320585F353CEEFE58CCF7679B40C61879756CF5E0C5B414BD12E40CDAA5BF8CFF77BEC1FE78823A879B94EBA402901F82DC91C3D60B43CF3C716C855A9DB8BBA52C5808A91A69C440D258F42D479CE7B8E280D51D5B425984197C7D36B04901F58C96E27BF157851D2E80BB31BBBC12278CAC72743F14E6FB43CD45332C224D2DA9C6936305BCEF851188464E1DC96F6CDC191175D565C42F sk = D322D56D8EF067BA1F24C92492B9C56DF3A6EF54A304ADC1B69913766A1CE69756047447B810CC094D400AB204CF9AE71E3AFA68B88586ECB6498C68AC0E51B936CBCEE9FC343B70CA3795DD04C06202D87235B65F09DF1D7FE1E3250E78AEB2DE11626C493E9C1748A50A3CDD40F2F4BC2030F509031E34DAF7E776927F1123C028A83A45C2E999D768FAFB1512A092B8B2F43D4CC04A2D358F659BD16272897318651A4BC835AA08AA725E153C8A3CE54F760DC4C4759AD30E08BC0E880245E5E0F6CBEB7C2A9EE1705BA442B564845AB83D769BD7CE4FF5A0AEA098A7ABB50E9D82856F137F733D638EEB4BCF0427EAE3DB6A4C8FFBDB13E68ED1D1022256CC1E4A25C0B4B670CEC0744AACF8AA6F4A29BD4C3FEF084D76550EEA4AE53DDA22D91A7E1A40A6F88B7ED77622590D0DBC22A2DA1AD6E9F11C7866BE084F376D096BA484F2B83A376AC49E8D38985F6B866FFDEA4A010B14600A2826EE7BF5FEEA25AD4BE39FC50EBF630188ECE9A4B024E6856B58A86B1A1922227937A94445B3F6C22656DBDE81CAD22F33DF50D678F9663D667CCA262A8EAAB9FC045754CAAA85B5F0BCD702C534B0A03D42163A7730A59C683F823C17216D0B7FF861332095CBF483BB29AF36DAFB9E784A548DC1EBA7816A4255E588039FEE28FDDE06521665E35DEB60544E8DED205320585F353CEEFE58CCF7679B40C61879756CF5E0C5B414BD12E40CDAA5BF8CFF77BEC1FE78823A879B94EBA402901F82DC91C3D60B43CF3C716C855A9DB8BBA52C5808A91A69C440D258F42D479CE7B8E280D51D5B425984197C7D36B04901F58C96E27BF157851D2E80BB31BBBC12278CAC72743F14E6FB43CD45332C224D2DA9C6936305BCEF851188464E1DC96F6CDC191175D565C42F ct = C7304A9B2FA472FAD7F27F4BFAAA6A65B88F8F62AE249FCCAD8CE9FA98377A89283926C73348111A8CCD0F7F63C17041481AB486E7B27813A57EFF4E9071DF627C32E7D9E27531F17C257457486CEF6CC3F404765628069E1F50DC90E854AF18C8C6E400FAFE636D7D16760E69205BC2109693C2DE8A67E9371EE194C51F2B27F28505D605E0947ED80D57A078FE4C202DA5DADC5ED6A37188B9D774022F2D602BCA7E1B074A236B34F9D25329DC03A0B42C93241B861FE2E17F7C4A7D056394B9D92EA40FE4B2686A5A5E5170AD236F4F611CB3C28D24397CFD93EC778314ED97940924BCDF9A022A4C3D7CCCA4665792837E54BE700719C8B227727B013A4D865C0B6E99A0ED768749FA1A3666B862BC0B8F133A1B1A1A5B57F1D9AFF6EF12760B0C49443509E9DDE709F6F4113F554B7D8C4BB8587B94890AC05A616A3B30EAF7260E3DDF86ECC48C132922F7B7D02721A133491BDAD2CD9E34D3ED64F6FDB5226DA243FD97B26A5635E8B3405989D4318751FD44F81EFBA009E64B1F33967DD5446813181CC7605F862ACAD41CAB1626D8797979800B52F40C2A7E2CC697F46526EBEB06C764753E838B63E903C4A6300ECDCA4496D743B08ED6EE5F17A2DC235A05B9AEDE04B5FEC27E29FBCC1A2CD5FDC85846CD950477EA382BA11677325901BB02D5BB8425A8E325AA0B256D39A824B7BF2A395F05CDBC2058ABC90E57256355A236C96DED766F6808DD07AD0A836EEBBBE187ABFB2D136821ADDC49679DCAB6F81175F681B27AE49B180FE478A824626B751911BCE5E84C84803BE4DBC35F9F2118073782F8AD98E7F24B51DCD964E2 ss = 60D025E770B82EC0302116BABD027CA5E14B918BD774FAE9 count = 10 seed = 980D0BA7C8F8B23D0E948A6029FF2659810EA1360064663A8994D0333C8543EE5FF5D6D5C9ACF446E61DC464F792B9D3 pk = E082AF0B0372DE8A2D931D568F3CA1D0C687BFA19A579F041C39AABE31BDE33ECBDC4F6CF81EDBD7E901AE654CFEA296205A4500AEEBCE898663B4740A28AC721D072EEFC06038A8DC321C069B1B301FFF4DB18B3D48D085E06BBF4B3F37930973BB5DF3F5C92D68D8B7E35E20AF84C13EF7F3FD7A7FDE4314177AB1C25D48C714DCF0CF821796902325EE87DC5EFD215AD1F76578F51DD17997751BCF77412F2FAE51F9FAB376ADEC8A35D8A44EDB68EC6161C2A442819DB4536653011453B74F785F30C2CDA24BB22A4561E9C94F22145711CDC1E8ECD80C8AD1D9B64AEAD7FD19A981B62576130B503539997ECB13E12049B41AA4FF85E8E724825FF89FF6361BF80BC49E6CF68BA95590E23D5F08BD63E374CCC98D0B415ECCDF1DFA5327542B356B81603196FE54567355903C4FEA8758739005C01F615784B618A7EA4297B681021B68570F8F174142B6244EABFD2B32667530DD41ED616499E169C4EE9626E7C7535FFDB37EE0EA91AF835437086E4CCF317ABE42F81422B935FE2BD084EFB3C4E168E3AE4B14E4012A2F8A69F7921FC7DD86DD33F85B020FBEAB7CA5D0B5B7FD3054EF7DEBBBCB44ED6B4B9D3B7A065D8C2ACFA8E55198EE1CBF5883F1C29C298FC8481CB2EA68650ECD730AD90D81CF954C8AF8970A7C4A31B0D2F3A6370D74C93EFB4C28CE6E524A9AAE141D0AE2B179B6ED7658EEDECC620D0A20FC6D70D88F88854414B4B55C0DCC39CD41FEF4219C0BE3D0459FEBFCCE714C3BA2B522570FBAD67206E25A6889BAB2E2D7CD5001 sk = 2F1D8A3BEBB34540324B9485FDF3D5BE3B858F544ABC3FC641B5728CAFAB03BA8D6C42E7270EE2B77B6045385F3D175984A0E260363166C73B0C70C97164436326466AD9341E61870A84C6A1C7679F01E082AF0B0372DE8A2D931D568F3CA1D0C687BFA19A579F041C39AABE31BDE33ECBDC4F6CF81EDBD7E901AE654CFEA296205A4500AEEBCE898663B4740A28AC721D072EEFC06038A8DC321C069B1B301FFF4DB18B3D48D085E06BBF4B3F37930973BB5DF3F5C92D68D8B7E35E20AF84C13EF7F3FD7A7FDE4314177AB1C25D48C714DCF0CF821796902325EE87DC5EFD215AD1F76578F51DD17997751BCF77412F2FAE51F9FAB376ADEC8A35D8A44EDB68EC6161C2A442819DB4536653011453B74F785F30C2CDA24BB22A4561E9C94F22145711CDC1E8ECD80C8AD1D9B64AEAD7FD19A981B62576130B503539997ECB13E12049B41AA4FF85E8E724825FF89FF6361BF80BC49E6CF68BA95590E23D5F08BD63E374CCC98D0B415ECCDF1DFA5327542B356B81603196FE54567355903C4FEA8758739005C01F615784B618A7EA4297B681021B68570F8F174142B6244EABFD2B32667530DD41ED616499E169C4EE9626E7C7535FFDB37EE0EA91AF835437086E4CCF317ABE42F81422B935FE2BD084EFB3C4E168E3AE4B14E4012A2F8A69F7921FC7DD86DD33F85B020FBEAB7CA5D0B5B7FD3054EF7DEBBBCB44ED6B4B9D3B7A065D8C2ACFA8E55198EE1CBF5883F1C29C298FC8481CB2EA68650ECD730AD90D81CF954C8AF8970A7C4A31B0D2F3A6370D74C93EFB4C28CE6E524A9AAE141D0AE2B179B6ED7658EEDECC620D0A20FC6D70D88F88854414B4B55C0DCC39CD41FEF4219C0BE3D0459FEBFCCE714C3BA2B522570FBAD67206E25A6889BAB2E2D7CD5001 ct = C55227B13C29AB38901AE6C8BD5DCD13303DF4E8F53329B2B1705E5C05294268C71A574FE1142FA8F2CDFC6AAB65F1BB8BE5E1FC136AF46F39853D74D229FC992904FA2A4623FD35B8B5EFDE9B64CB44EDF36D939FD0F11A09BC6BDFFF3841E182DB24A228870C0AB036E7729234B8AD40C8F740DEF95432CB7AA5B89361713390A782B139772699394B44CCFE7381B995BE24F1DBD6AEF76D85039025335EC1CA849C8057CCC85AF7E7AA04A218C391C47B35EABDFA4D39272DE61CEAFF344280E7E62CE867553AECFF3927EADEA0BD793BC6FA287DE89C1C24BB7A278076EC1D52FC4F007EEB364A053FC2F31BDF32114EA77EECB8C20CCF96BE6AFFD93AF046BFB00562008A3917089AAA2DC2401713444A0B7E65C871373784979AE9E93E7CB3309B3DCC33BB2478DC73B37FD2467C263761F3F2CC9B65AE55CAE7E2B33277D5D815CBE503549A67E86DE7614085236E83878D33B9D141ED1A827FEAA9773B34A65E01F96C3B1443B1A474983725D59D735A4621395305D320BC5454D9592A751371939C2C670CAAA9FEA9E072A96829066EA9E309FF469C17B438CD1F4E2A002D6F9098F468ECC80D99104A6E6349A60317DC5673B4BC230E6130756F15E6AEB7C96BEB8EB0A93AB9044640DBF4DDEA52C1602BEC93B7ECE209B76232818C31C74BC34A33C15BEFDC97436008A69C8E4D324E442FAAC990D75140B7B1A881C5432A74177642F0AD03FE869DBB989BBF6BCDBEE476274D9F59BABC6EC4CFD8BFA2FCBB19062D4F31A7F26ACAEEAB8235DC4EFE6B7F2EA08F6F850EAA3002E5E241707CFC1061E445579B010CF4C7F83EC92D ss = 80302FE9ECC35A96CA12DF74F475B59B4F477ACE9282F271 count = 11 seed = 6C029462CA42ED520F10A579F52687101105E0B90C6E7BFA582A4C112B579D5AD0A0ABD38F72ABCFDCAAF5893A112BDC pk = 945847BFA4A6DBEFBCAFD6AF4D5652261B021EB788060CAE93D26FDD2259275366302A40B7CBBBA37D68CDAF57F27FE048D38175C653FA6C52A6F32587FDA2B0D5C55C4E814832AD26B24A9C5573F18422D695AC4ABBF9A8E9BB89A6D0422A7DC4F0C0802190FD4F0AEC55512BB985A790830F4242C3FA83F4E18060D7D9D9919875966B568B70487FAFFE17FD8E5AA9B28A9B27AD0A52CC10EE1C9E5D12DF04E5FD158D9139F45427D94E9983D067FEB1B7B59BA30109F94DA21D11151B4E7308785FB39F6E8E362C7248FC055718981757A63C975E4B47FB316585A719F6466C7C2043FEA9C32EDB2892DB965A28B91F563059DDB9E02F47DDDF446CD886CA32F190453974FD03AB91AC3A101DB81061E30BCB75138382C1439C73229380BA787E40F92383F7F547C706F8F02656038C0B2782D6F1EDCF14C96102AB90D99E3A7A3CB9CF4F871EF599E69F4B6E08B7E0F21406F6A430C5C188358B52E9EA3F2B4640E71DF580FCB0901894814E294CDD408BF98CF08314C8D82DFB5896438E36C663A69C4FF4F59CBDA619285772C0212C94DD0C2A95135A3EBA67DD8FFBB806E525209D6174A18ABCFAF638A1735DB10BFD29803B429413CC69511BC762B1546D8C143D0C0DF5EB2BD8F720F6CFD9936900242050FB50960786D5BA26F2182C34FF612E3AE2700BCC2F5EB5B9882825F712E8EACF76B69146FBB98F86C12E228308F7A4EEC111600034D4E32D66BDCC8CDC8A44080D2ED8353CA24FC75050BF2402C35F8EE9D35214731A140BA3C92FF83947 sk = 31BEDA3462627F601CBC56F3DDF4424E1529C04737EF0EF2AF6D7401F653B8A1812083BFA3B670E3EAF9B443702FB6DB16AC1197656BBD61A8E25ED523B8D1E5D2331859E2A7B4F3F9858D9D97F7C703945847BFA4A6DBEFBCAFD6AF4D5652261B021EB788060CAE93D26FDD2259275366302A40B7CBBBA37D68CDAF57F27FE048D38175C653FA6C52A6F32587FDA2B0D5C55C4E814832AD26B24A9C5573F18422D695AC4ABBF9A8E9BB89A6D0422A7DC4F0C0802190FD4F0AEC55512BB985A790830F4242C3FA83F4E18060D7D9D9919875966B568B70487FAFFE17FD8E5AA9B28A9B27AD0A52CC10EE1C9E5D12DF04E5FD158D9139F45427D94E9983D067FEB1B7B59BA30109F94DA21D11151B4E7308785FB39F6E8E362C7248FC055718981757A63C975E4B47FB316585A719F6466C7C2043FEA9C32EDB2892DB965A28B91F563059DDB9E02F47DDDF446CD886CA32F190453974FD03AB91AC3A101DB81061E30BCB75138382C1439C73229380BA787E40F92383F7F547C706F8F02656038C0B2782D6F1EDCF14C96102AB90D99E3A7A3CB9CF4F871EF599E69F4B6E08B7E0F21406F6A430C5C188358B52E9EA3F2B4640E71DF580FCB0901894814E294CDD408BF98CF08314C8D82DFB5896438E36C663A69C4FF4F59CBDA619285772C0212C94DD0C2A95135A3EBA67DD8FFBB806E525209D6174A18ABCFAF638A1735DB10BFD29803B429413CC69511BC762B1546D8C143D0C0DF5EB2BD8F720F6CFD9936900242050FB50960786D5BA26F2182C34FF612E3AE2700BCC2F5EB5B9882825F712E8EACF76B69146FBB98F86C12E228308F7A4EEC111600034D4E32D66BDCC8CDC8A44080D2ED8353CA24FC75050BF2402C35F8EE9D35214731A140BA3C92FF83947 ct = 90DE7500AF510883F6B1E61AB02BFA0A48A557A0E1D880838C13EDA26F292FBF335FC248BF7846FC8BBEDFB01AA29875AD568498B9D47C2832AAC3C1AC6BEA9A1DB7CE8BF9802291E9D288FA0B583729AD1504BAD3E78528CB0A3606384FCA3B098B5482BFEC76D1B38C428F48384E5DB61843B0DFB681F2215B85C326DCCDD1F169632C24000401F9529CDFA95BAF55967823182268B14A7B55FD245E21990FBDB236CA1AC09F38F76826BBE0D907866D5CFEFC2AEF0C331A4981595923BC5CA6BC00C02DC0AAA193D4A6B1C1B3C71DBDF01D36311D20342CFA7DB31D880B85937E9F9606DADE7ECF822AAD6B21D4ECC06796AE0DC2B6B963BDBEF75B1BA7DD06ED04E53B2C36CCF376EEB3BBADC955F8A19B591A7F312F7B611E656A25EE0DF700BE9069CC51F567EBDA826FE8884D2FCDF15673023A5D0D0B105A7B94A40A192D212D97B5D308516A20DBAC0D0E9AB37417FBE71EAE90D58B69D7BA65218721525E6F785B37BA6FD624691834608C6AD0D0F9476DD017FCA478E84092597C58B91E83C401A869DFED9A000979CED96D2AC251D35017FEDFE3B1C834359E544D57971BD8F6BD999546F262E1D2C7BB0A0376DEADB4266D3472C106E20E02DE42A4C7760A9CA97E64B334E7F43A2FA86544FE68D408F4338903E824358601021592969545302A58652108C6A27E59F2842C7D3E679563588A1A27B64A35915CF856D04E78CEEACED2EDD0DA84C53F54FF51484D97AF33710AADB9C1041DC28D815B9A0935EF1495DB89E83C54DA7009D172DC463EF5E5FCF20A214EB53A025163FA00C7BAD1E8A5538A16F78E15EF040B10A1FE ss = 537920527EE02BDDFBF995FFEAD6CADC65C7FE562FE21B54 count = 12 seed = DB00120937570D62331F4C3F19A10465231EFF46465CDEE336A0D46AA1E7493DF80F18617F9FFD0476CF7784A403EF4F pk = F78D6575382D1F35F600853D6D02A2B8EE1BBD1F5D77469E134F2A88F8BC338383B49C150B8E55A4AC9D946A104698316159DDB08071308BACD28DDC46F09DFBC2FD7D2CBBD18FD211ED4439ACF1419A6612EB409C11AD305816562D2520895F5ECA57A20F0B083C918E9002A2668493F0BD98D04FA9640C66FD2EA37AE7CF7F2BF41650F9926077210535DDC797BD9B84591AA08775225BBA3E971FE74028E5A5E0F71E5C65643263164BFCEA0003D9980D8E1397B02514BBCF9E59875A546874FA3A70192E08F33AA40A71C44431040103A23C9087DA67D49F599A9B4DE675D54ED789E425E9AC0AFA3D0826075AE8722E3E936ABA7E8979343B29314DF10020127ECBDAC9503E397A3BC4490CDEF997693304F61DEB364F510720B7595D727CED5525029851B2DC7E74B062AE89F00369E32165CE06C2FC58FA69BA0A58B04DF0F926B435198E05B5EB7953A8D9AE113123E4DACF6F55273281811F5D3DAD867567E4B89C983973D21BC4642D137573C44E90E64D104F257395971550C6D8A6CCF8489B22A186B59177F3333F09BF1B2D03B3C8333874C968ABAFF4F77F74ADAAEC13FD882FBB8A6B590630BEBFBAF3FCB8D1E9CE48B72A0F6C6C505EFE52D14CF606EDB2CCCB38EA66EAA3EA4304A42C4E0A2263D5653181F787B02C4B95D5EA9858F27560A02FF91CB1502C4E8CF04E8AC2CBA7C8869C80F890A4D837772CA2B45CABE9A0635AB56357EDF1DF4B6B2890B64896C60BA9DCC110D500CD09164F533EBB8723F678C354042D194C706B1B0E07 sk = CBDFF028766D558AF4466EF14043A1A9CF765F7748C63CC09DCEB59AB39A4E4D8E9A30597E4B52FFA87A54B83C91D12A5E9C2CD90FCAC2C11B3A348240411A4C555A3DEF09A64C09E9EB370293203E03F78D6575382D1F35F600853D6D02A2B8EE1BBD1F5D77469E134F2A88F8BC338383B49C150B8E55A4AC9D946A104698316159DDB08071308BACD28DDC46F09DFBC2FD7D2CBBD18FD211ED4439ACF1419A6612EB409C11AD305816562D2520895F5ECA57A20F0B083C918E9002A2668493F0BD98D04FA9640C66FD2EA37AE7CF7F2BF41650F9926077210535DDC797BD9B84591AA08775225BBA3E971FE74028E5A5E0F71E5C65643263164BFCEA0003D9980D8E1397B02514BBCF9E59875A546874FA3A70192E08F33AA40A71C44431040103A23C9087DA67D49F599A9B4DE675D54ED789E425E9AC0AFA3D0826075AE8722E3E936ABA7E8979343B29314DF10020127ECBDAC9503E397A3BC4490CDEF997693304F61DEB364F510720B7595D727CED5525029851B2DC7E74B062AE89F00369E32165CE06C2FC58FA69BA0A58B04DF0F926B435198E05B5EB7953A8D9AE113123E4DACF6F55273281811F5D3DAD867567E4B89C983973D21BC4642D137573C44E90E64D104F257395971550C6D8A6CCF8489B22A186B59177F3333F09BF1B2D03B3C8333874C968ABAFF4F77F74ADAAEC13FD882FBB8A6B590630BEBFBAF3FCB8D1E9CE48B72A0F6C6C505EFE52D14CF606EDB2CCCB38EA66EAA3EA4304A42C4E0A2263D5653181F787B02C4B95D5EA9858F27560A02FF91CB1502C4E8CF04E8AC2CBA7C8869C80F890A4D837772CA2B45CABE9A0635AB56357EDF1DF4B6B2890B64896C60BA9DCC110D500CD09164F533EBB8723F678C354042D194C706B1B0E07 ct = 68FBFAE40DA77F4DA2A7183E04B47ACAC4879CA5E018F31BEA35A4E898A78214EF0152481C63682A003949861D070F0EE0F60E390752DEC72B40A95036944A6A17854DD56CB9D3A5B951706028A36C235B1044129330AC801E5DC19953231A51E27D2AEE1DB7112E64999CD222886A891D88885EE6B19D9EF2079113065BF40B1A7C43049C5E4C2A12E64DA7E5BAF8A6515A998A12DC16D1F147CE33FA8A5FFAA48369EDD2195835D9E81E347EA0CF936414A00B90969FD1C075195E8625817ABDE77E364C8E73EB17C9358558387BE0A89E61FBCFBD295CA05C2887D0A2CE22740248641581265E22A2D2D147091A0E5ADF530BD583FC2422A25F23190B6CD78F5E8C3CB83E9438FD05366A6F63C04753FB584119A3AB2C1D1EF34438FF43AE0F943267EABC2321A433F1CAA016FB4EBB2FD2ED0D193AFA7146E62578790C912609A8CA5EF875CD166A331F8085C24576936E4C1F7DC9D80F1F1ECCEF04FCF955C01BAF5C084EBA3D3ECB959CA0AC0E70AED0C9CC785F042C9DB5C42A7E5396F28DFF086C9F325FD697991BCED647EBA7A27644E6D98F1961F24C34F8BD940B4629CC8660C8D69CB1B8B927F2DA901009DE681357000019B8191CF0FA3C22A4CAA093A7F6AE03C8E7DF095BB60F0A0A1B97FB41E01E78C60283C8E7C89C7327D68B05CF583883FC44418686A65BD90321F15E7872F38C83A4DE9467588EB6E8CC5A0C5A97BED5D1A9C27605B5DAEF59216007BE36430F6837C915F0DB5C02FCEDD0F1F02E9DD3ADC68B736AB82C99443A754F2C77C4A63ECA8731DF63F19E7F691D9D1E047EF5D48B31DD319844E068C6E2133C ss = 5B2A946E9D2A58ABE065CA470F48F4177CB3D1743597573A count = 13 seed = BD26C0B9A33E3B9B4C5D7EA32D5BD1FC371015BE163C86F584E49BFD5362C8D8341161CD1308115B2A03B7E5EADDD418 pk = B5633A39F5A5C6743992B9853D955E033080BB1124BD4EABD70C93687481074FBC1F41048F6A1250602BCF79E812FBB82DE51F723B011DB8E357D9FDFA1E655E789B2A38C0FC009907BCDF663EBE8ED3EBA9F4CA1BB53E9007419ED83C0A3C22167BD1BEED93B2295079C2DD5FC30003BF0C4AE8621264B6988112719A7D5E4A0B22920F65D443B3A3E9B3E5BCC8A499757F0496FBB10E104B9CE889962CEB6D639EBEE309910BDBEF8FF898DD033CD12D58F67DFB27537031B6661D853D9B2D4BB0D583D325A3422BEC874D2F47BCF57C83748D3F07E2E9DE56ED9FB1CDE4B0635301A5C205C14994F8F5018609EF1819C66933D4F0C95E82B134B668A97503CD8354A1BEAE71C0CC1BE877FC2C63A6A111200D90FC9AE8673795C6103C2539D21106A795C03AF6C332E9EFB18B8575BD3490B32DFFDE24B5A233436ABA57B0045EF32360BD9F7AAED53A915124BFBBEA0CB3FF95772B79DB68CB25FBFBE2F6BE87E3F0C54C898D0BDD9479F1A7A91BDE64BF83E8FF86484BA77629E806E18701ED9C55C1166CF09252EC7B0DFEB0F456B57E961B68132A2B422D9FD889210B84AB0511D0146C5A7CD1A90A32C9A9D7A72E1C012BA7B759D3E643F760D0303759AF56863A7D9C1A56D3B486CBF512D22DC535067F36AA8DB3BDF7BA2412067D9AA8BCCF1AB1EEE3EB564B372311A6CF82482AF01A93A98EB512046D76479752283FC5A241F82FE157C0D373DADA9B3664E2CCD80A12F371435E5FCB26FBC6135C3D448220D44C144666A4AB3B52A2824F737E51 sk = 4C04310BEA66305C6CA8BA6B8F61CA96257A67663AFC11761F13FB5C7B324B6B8AEC87A9A79204CEE2986867A2906EB851B734B8B22B91D6749B1A5F07C44E3B8F1862A59F55A7C0859D28B7F2A8E703B5633A39F5A5C6743992B9853D955E033080BB1124BD4EABD70C93687481074FBC1F41048F6A1250602BCF79E812FBB82DE51F723B011DB8E357D9FDFA1E655E789B2A38C0FC009907BCDF663EBE8ED3EBA9F4CA1BB53E9007419ED83C0A3C22167BD1BEED93B2295079C2DD5FC30003BF0C4AE8621264B6988112719A7D5E4A0B22920F65D443B3A3E9B3E5BCC8A499757F0496FBB10E104B9CE889962CEB6D639EBEE309910BDBEF8FF898DD033CD12D58F67DFB27537031B6661D853D9B2D4BB0D583D325A3422BEC874D2F47BCF57C83748D3F07E2E9DE56ED9FB1CDE4B0635301A5C205C14994F8F5018609EF1819C66933D4F0C95E82B134B668A97503CD8354A1BEAE71C0CC1BE877FC2C63A6A111200D90FC9AE8673795C6103C2539D21106A795C03AF6C332E9EFB18B8575BD3490B32DFFDE24B5A233436ABA57B0045EF32360BD9F7AAED53A915124BFBBEA0CB3FF95772B79DB68CB25FBFBE2F6BE87E3F0C54C898D0BDD9479F1A7A91BDE64BF83E8FF86484BA77629E806E18701ED9C55C1166CF09252EC7B0DFEB0F456B57E961B68132A2B422D9FD889210B84AB0511D0146C5A7CD1A90A32C9A9D7A72E1C012BA7B759D3E643F760D0303759AF56863A7D9C1A56D3B486CBF512D22DC535067F36AA8DB3BDF7BA2412067D9AA8BCCF1AB1EEE3EB564B372311A6CF82482AF01A93A98EB512046D76479752283FC5A241F82FE157C0D373DADA9B3664E2CCD80A12F371435E5FCB26FBC6135C3D448220D44C144666A4AB3B52A2824F737E51 ct = F1D93D2B95814A7ABDB82CF36BDA245B559E58B844DBECAA86774CB287D8F05A4F75FFE26D4D362D2C5833FC6FB09170A9CE0A2771B94CF7A71F1AA872BCB1AA06FCFF95FBE0B36BE041382BB9F3CF8DB94C20473C7AEA61E9DFA7C31A4E89B99CAA0E1D6965A346A2538F2AB983CA17695B890987B5EE528E50844816391B0BB6EC887FF9A01318254CCB6EC844505AD33802A3B1476E144381094ECE24834D4F4C933AD3EBD1051D0AC669D70325C9F9169EB783C686DACD40AF1A152FDAEA2A5AD1439DCBF7CAF7C07031427198C6CE6DDE160BABAF7C9637259AA4C616FA6DD57E7AE42AEC5C6A80964A37F1111D11879EDEFBC9BB8F8B4168B5DC42FCD9654C243A8922443D89D360D4C21ED153FF5F04B3741DDFB162486AD96EE5118C23CEF1E51B31AC9EBAF2754C649C9B2F1E4B5F1575653141F11D1F5D422EA7BF9ECA5673CD1BBB08282032066E8107FE13574BE59706D9A2092DB17F4EADD67C3010E386401DE67BEB6C0F7AFBF161CDD7554EB8A91EAF2C13FD8DA921E86A8AF360495FD10CC4524BAC0320449FB110FA5F3F2E969C174127572BF2A4F466770C1A60A9C3026DC8B4E05360716CE1E144DE202F645A169428FCE8C79AE224A9DC2A9D83E3DB812BF50F90D129729C6805F0DC796437FDF2317A1E0095920C5DB9665603D7B02D0CA5E0930E8B0519525EA1E7C4BE71E55D7F19544C20079CC2014AD9C6A3BE8E06EDCD0446E3B3D745B4208E22B0B73BDF25C2D10434BB6A4772E5FDA67F2EF1CAD1D955C582B71823FCD2E85B15783CD1572CA16361D73DCE5C875DC4E7DA0597F5A6345EAB7C191D543902A3 ss = F975D58DA8FA750E0103B3A85B9224A5A7D133C56F6324F9 count = 14 seed = E2819EF86853BCA1B9DEE7EE1C1619988964F9A913E635AACF0D96CA6E0300D084329DABD8F149E24176D22757404260 pk = 89837033F02DB78E320BEF7D0FA6A889B5CAE2288401DAB41D7F64CD618AF8DB82095980D6344061179984F134A718437FCB3D70AAA4241DEFFC9D3E818B785B8B5F2E4AAC00BAB225C5F499BA3F1B75F6BA3D9B3632FD6797E4D308026434C5917AC02830E258CCCDAE59C0E845FB6404819D21695D44365FA3C396D45F87618C0895B4D3C14718913994F1A2919FFD66EAEF2AF2EEF6F2B2FC36B4B57236A7F8EB37A9E20EE49547175B4701B016F7C03782D54305844CA7826D28B083FCBD03CB7234F11D2F1151C92FB72B3D38E6E2F1B756A6869B2BADC68300C8D7231889834A4BAC3C718C4D054948BB38A3DF74898C98536EA91C98A0574345059F71D09E7480B3908275EC80D2369358596456D8DB5C3ABF99FE141215AA0A1B1826C54B1478B390186B1A8152E901CDE0D311B2FFBDE9534932F7BC95D5597E85F37474D39C440220685253F4D0014D84F209D07A5C5F6044A30F0FA13806717D1B5F481F39BE32754D06B90B6964B8C02C886562478CBF973F98C66E6215AD788A2B02571731E2811903ABBC288CA323268CB29374A22D2C198C67F968F31DC92DDE2062CEA675F85B2E410DE73644BC255CCB8DD6EC6ED9C97306F0FF90688F7557F13C8C2220E1CD85D6EC3CE2C3A1C5872CA80DC74A300B677059425E601FA66AF32EB153B4910BF3DB2FF431F0EAA9D9500E1B2A07B0612C781663CE1DEDD9D8FE02AEED922D5859A936C3CC9F9899A43478F1CB887F15B1891A0F9628B10CDBFF0CE2BE41501BE22842A254C60DB361AA1A6F sk = 38A0D5F41D7DC1896EFD1B45B0485634CEF149828751B96087A0A6DD81B4D58AA2ACF359556DF4A2ABAEB9DCEE945829BEB71185B4D6BD18B76E5668F253383A0A0A185738805628063B48C2EBE37D0189837033F02DB78E320BEF7D0FA6A889B5CAE2288401DAB41D7F64CD618AF8DB82095980D6344061179984F134A718437FCB3D70AAA4241DEFFC9D3E818B785B8B5F2E4AAC00BAB225C5F499BA3F1B75F6BA3D9B3632FD6797E4D308026434C5917AC02830E258CCCDAE59C0E845FB6404819D21695D44365FA3C396D45F87618C0895B4D3C14718913994F1A2919FFD66EAEF2AF2EEF6F2B2FC36B4B57236A7F8EB37A9E20EE49547175B4701B016F7C03782D54305844CA7826D28B083FCBD03CB7234F11D2F1151C92FB72B3D38E6E2F1B756A6869B2BADC68300C8D7231889834A4BAC3C718C4D054948BB38A3DF74898C98536EA91C98A0574345059F71D09E7480B3908275EC80D2369358596456D8DB5C3ABF99FE141215AA0A1B1826C54B1478B390186B1A8152E901CDE0D311B2FFBDE9534932F7BC95D5597E85F37474D39C440220685253F4D0014D84F209D07A5C5F6044A30F0FA13806717D1B5F481F39BE32754D06B90B6964B8C02C886562478CBF973F98C66E6215AD788A2B02571731E2811903ABBC288CA323268CB29374A22D2C198C67F968F31DC92DDE2062CEA675F85B2E410DE73644BC255CCB8DD6EC6ED9C97306F0FF90688F7557F13C8C2220E1CD85D6EC3CE2C3A1C5872CA80DC74A300B677059425E601FA66AF32EB153B4910BF3DB2FF431F0EAA9D9500E1B2A07B0612C781663CE1DEDD9D8FE02AEED922D5859A936C3CC9F9899A43478F1CB887F15B1891A0F9628B10CDBFF0CE2BE41501BE22842A254C60DB361AA1A6F ct = 9C687A6F7344099E6FB6B24E35C8F70100D87327E5ADFE04EC2A5CEB2909BC5A5B7966E4F748E7BB87CD9897B21599EA1EBE5AAFB8E447D8C238685DEB23D262DF16E175ED4CA2203E1BA8154CD5CFB807202897FC12E2B8A2496085461499B15831123FDBC15A1CB6C08E415D3EA40C230647C3B174D296079B9E3AE80CABC701A75399EAF94D3BA792D463C76D85EBE7AE5DA8385BEBA4FCE11CDB8A1BF1B074CD1489677E9B3F8C300DD8310C7BD45F14093FFD9DA42C9812BB6F43B7C4CF3D01DBF7343FFE1DF4D16E79183A1AE9B530C29456A313A90F1B882D047BB18EB6789A8B7B834D76E7943910B7636CAD506226C9528C9BA7276626E9B070A16898FA056A07F7AD074F3258DDDB4A6E2D5A9C6337BF0BA180C608EFC707DDB44FD0C72BA6BB2057DE1F7B33EFA3FFF596DC22C9C71B4BD15C49EBAFA4B3C8E9E3FB9E28851DF515E472EB4D9D76F60FAF6502C13F21066EF3FE43290441EE3BF00F440411899C11B60033F71FD98891590625EDB37A9B293BBBB64B1722E538AA84CB990DD07FD4F63B42A26E50BE69DE888819BC7E5E26F549CB249BE9D8CA3FF0F2E92DF04A0985A2A34722F9922A47949D747539841402509F3636BCF5F8EF2E14CDE749B7BF4999863FB29A5D60F4209735035D4996BC3AE8A76BF9342A7557B92BBF2378B8AC425090CEBD44EC91ADD5F87C0BD754A0792DDB3E8D9441452B9EAE05801B3E37A0E569E7930D72F73E94FBA347754C2BC35A4213E881E92D60B7458C1F482FE80C6819D61DBB37B31DE2D655A8DA9335E53DC35C5E73835D00C689860228C76F9A0162257185547046CEB6BC ss = 81C1CB4FE6A79370BA5582B4D89EDF54FA1D7C04357C2BFA count = 15 seed = 669C4EF8A051CE201DA65FC4BC34D398EC1F806276FC5D987AD71D93BC12DC8F107B58BE6E8422A0795C88CB9A0E7488 pk = 8A907563EF1191976E5781C50F454640397CF6BE7CB2A4AEBB86917108944D1C3F1AEFEF2CD4794C4DDFFEFDC1BE8A4FD4075DA71EF31CA66D4FDCFD046C212A06F4302C32C50D2F03B7A7818C47AAA263489BAB1ADFBAB80FBCC120EF5AB0B86AADC9A1C7CF80E60DBF4371EFC62909C44EF85C669DB848E0CF5F220B9F5625A73FD05962B03F4627144E0A582255B890B3E5EC82B084EC12523EA2D9D6DAA31FB6B5015B2B3FC1F10D9BF205D1BFD6BC21BC7342DE5291048F4154CC09672BF6A40560760FC9411AE226D5D925A1CF7BEE7E48BA8A5D33708F6DCFA2E7E2F48AE607B555659FAA1068E1B9ECDDF467A0A49D6D06597DD1E6F35707486415FEAC4B0C08DE85BBE7F7DD3FA7043491FDD922AA2B69601013CF21F9122F4CC144F4FBA967B65C480CE6ADB76EC1EEACB46DAC68CC938E8C133B75C5C829EC209A02F799CA34B0FCA5BB4940FB1B01668D44F1A23FCFF16D676135C3882C2FCCAE85ACA8C7B705403548BD47B83D0D8DA24B5C09DF43230F31C57DD9B2E6C6EE02BF2AAFC6EBB523C9BB03ED3BEF4BA3A73F0BC7707A11C8BEA3923128CC604FD0A1012E421078B942451B3B7D62949CCC17FB077DC4EBC4E516B540D9A652F447D47964180FBDED48AD851023292BAEF1A503A4D60920F4699623FB09514076078C35B625B26CD15F703F8EB1B3B8EF730C541119C1E6D711104368599E48DAB6A87D10EA974640B2A143DA5BE1187D37DF814DCEC46103BA3137A127A89583FBB8D72259956DF1AD3C53659BF70EAB61A9F8B26A sk = 97B5665676E59E3538EBADAA8CD50DF1F9FDA1502D9894C616A946078E56B621DF05318B5F655EFE36F1B678CF4B875108A18DB2FA312261CAF839F84BD956C55EF849036D6447BEDB6010EE65403B028A907563EF1191976E5781C50F454640397CF6BE7CB2A4AEBB86917108944D1C3F1AEFEF2CD4794C4DDFFEFDC1BE8A4FD4075DA71EF31CA66D4FDCFD046C212A06F4302C32C50D2F03B7A7818C47AAA263489BAB1ADFBAB80FBCC120EF5AB0B86AADC9A1C7CF80E60DBF4371EFC62909C44EF85C669DB848E0CF5F220B9F5625A73FD05962B03F4627144E0A582255B890B3E5EC82B084EC12523EA2D9D6DAA31FB6B5015B2B3FC1F10D9BF205D1BFD6BC21BC7342DE5291048F4154CC09672BF6A40560760FC9411AE226D5D925A1CF7BEE7E48BA8A5D33708F6DCFA2E7E2F48AE607B555659FAA1068E1B9ECDDF467A0A49D6D06597DD1E6F35707486415FEAC4B0C08DE85BBE7F7DD3FA7043491FDD922AA2B69601013CF21F9122F4CC144F4FBA967B65C480CE6ADB76EC1EEACB46DAC68CC938E8C133B75C5C829EC209A02F799CA34B0FCA5BB4940FB1B01668D44F1A23FCFF16D676135C3882C2FCCAE85ACA8C7B705403548BD47B83D0D8DA24B5C09DF43230F31C57DD9B2E6C6EE02BF2AAFC6EBB523C9BB03ED3BEF4BA3A73F0BC7707A11C8BEA3923128CC604FD0A1012E421078B942451B3B7D62949CCC17FB077DC4EBC4E516B540D9A652F447D47964180FBDED48AD851023292BAEF1A503A4D60920F4699623FB09514076078C35B625B26CD15F703F8EB1B3B8EF730C541119C1E6D711104368599E48DAB6A87D10EA974640B2A143DA5BE1187D37DF814DCEC46103BA3137A127A89583FBB8D72259956DF1AD3C53659BF70EAB61A9F8B26A ct = EB6542AFE5F1C9C32018BB1AE06C589D1F70CA2BE5C121466446E5C69FA776756C26B74D725B9CFE5796A5FE5B9B178FCA1E111ADCA9C2204A1074A0A805C9747F0D46A444F9DFA819871371473C32E106A3C5F47C9BCD200AF36F5A251F1309F96A30355E0815BE1BD76588C38B503F1B7A2AA552D7A3895848158E64680473C361BDB8088D108C2B599E147E1CEB734D3D44505E05246B5458B6D82584FD9D7A26F29A9A08E45BBCBCF1678FD7A1B82C3AA007EE15F1D0AA1F1D179D9A8F31C64CDCD8F800CF90AC5F4B9A53C3A1D40868E223F3EA75395A047185E2BE07B048436C9B54360E1F58E037A1E7B6F8F5487E773A118AD248908E394AFB84B61F68909E0D582ACE5F6AB7633C6F7A18263C828510040A4BAEF93795A544B124280737E3BDE88D56674E7DDDE813EED2EAC0FE28D3F80EFF1EBD071CA1B116C5DA091241C499AE68025C789F6013B98DC7086FA0A687B32BA94A8FF9E3B084227722FD2638E4060655FB13F959AA942D458670C985A5C0EF4AE7F3E136426F417AF598DC297243FCD252864589B3864CF42593581EB36E84215502DAA8E9A97302CC52EECE6226EBA08231CD761EE2A0262B7437355463C47C9F119C10ACBFB2FE787445F94B5B5C6482326CE5FE7FA5D6CDD2CC684E5A2E45F7D15C1E6BE17310B4F002260A4746B5939E0BD3A308E3EED2D0BABDB0744456D812A8F4D782AB66E0B630BC2EAC0C085BCDE752EF7108915899759EEBE5134041EC9363BCC6D33D0BECA85B9FD41431F2565097CC274872B600230C5C5E91AFFF9F93714054CBB1E75A1E86C54D2F40B85FCB9C074A1A070399F806 ss = A805204251DB7AAE8AD623F8E308676930E52002AA402E99 count = 16 seed = 9DEBCCFE818F6B5204DB4EA09C03EC9A19DCF1629C1527685B8A29776BB1DAAEC45F8ABF8F0ADC9A8C8BD6E2DF6D8048 pk = FE77653B5AFFEEEAD7AC8ABAC2527E59DF75281B0532B5A528CA4D3FD232FF3ABB280A1CA705C48AE2D432DD2654597C56E24B60533455B88ACA8B5924D1A0FBC5B67BE1DDC2A7E3FEBD467D3848824D0FB7C2C58D1FE6ECA7D1FF9E29698AD2B0341E31E891ADBDA68180648EE6792AA3F67900262F25AFEFF70EEE44FC86A99AFD747F689FCB2047507491D3CF1509BE210BD8FF80D88BB864D339D114B985296EF43A952487270CC3AADF09DFD9A59507B9B9464039CBE7838228DDF2966B4242F14E664F235DAA5E9B14815062255B105C38F10AABD9067BDB170CAFDCDB43A04A2DBDBC208C49D8ABE82B4A1EC5052EB9D6D6BE8BDBFAA155D7D55FDB31D02342A06D22F2AC36C6C6811090625466DE558DFBD12A3381097BEE54A5592569668B89E357D9AC63F23B07143E654806296C716E06D5D2280848FBD97BB70814CC8F407D355E2C435771FEBC568F2E289BDE8F78714BAEB81609A8B2830AEC44543A6FC13BDCCE1A8A9D8923E40472A83BF45D5011995B08694F903DEA4520BA117111AB1E69042A20D463B9F0678C5D14D1EF5F0D1293F9B434034E49C7877DECA7ED72BEB82D96963A5A991E3A1E6BDBB121E4D2112A77421BFA3C2F6843BDA6407E2887D7EC2422B2D000D6C69B2AC7AD3CCB2BAD981F83D7D33EAB0479F6F98488F739B1D0F5320FDC1D1E097327C73C025EFBC9DB081ECCC40A7B049569A433F9203C62D5BBACB997C1134A7B4B7865ED184C26503231ED1CF7BE9945FB827007E544A03C58D4A0326D290ECA46EC0418 sk = EF99224A03A85A46EF115474EC5B5D620DA6795D6EFCCA4C9135D19958A9DE62DF7D92DDA83E6B2EF4CCE08C9134563063068A196D7B1A1A13623E48AE12528E90150F7F22A2EFB276D6C4FF6DDAFA02FE77653B5AFFEEEAD7AC8ABAC2527E59DF75281B0532B5A528CA4D3FD232FF3ABB280A1CA705C48AE2D432DD2654597C56E24B60533455B88ACA8B5924D1A0FBC5B67BE1DDC2A7E3FEBD467D3848824D0FB7C2C58D1FE6ECA7D1FF9E29698AD2B0341E31E891ADBDA68180648EE6792AA3F67900262F25AFEFF70EEE44FC86A99AFD747F689FCB2047507491D3CF1509BE210BD8FF80D88BB864D339D114B985296EF43A952487270CC3AADF09DFD9A59507B9B9464039CBE7838228DDF2966B4242F14E664F235DAA5E9B14815062255B105C38F10AABD9067BDB170CAFDCDB43A04A2DBDBC208C49D8ABE82B4A1EC5052EB9D6D6BE8BDBFAA155D7D55FDB31D02342A06D22F2AC36C6C6811090625466DE558DFBD12A3381097BEE54A5592569668B89E357D9AC63F23B07143E654806296C716E06D5D2280848FBD97BB70814CC8F407D355E2C435771FEBC568F2E289BDE8F78714BAEB81609A8B2830AEC44543A6FC13BDCCE1A8A9D8923E40472A83BF45D5011995B08694F903DEA4520BA117111AB1E69042A20D463B9F0678C5D14D1EF5F0D1293F9B434034E49C7877DECA7ED72BEB82D96963A5A991E3A1E6BDBB121E4D2112A77421BFA3C2F6843BDA6407E2887D7EC2422B2D000D6C69B2AC7AD3CCB2BAD981F83D7D33EAB0479F6F98488F739B1D0F5320FDC1D1E097327C73C025EFBC9DB081ECCC40A7B049569A433F9203C62D5BBACB997C1134A7B4B7865ED184C26503231ED1CF7BE9945FB827007E544A03C58D4A0326D290ECA46EC0418 ct = BC47AB5A8D3449E642D8C0EE9038527ECD411B3C7CA00118E3D15280E3DDC58B6ECBD87EE63B8A70D7144CC21B825C5D460357275C69ECDCCBAFA4E8EDF7786BFBD4D7A126EB709430599ECC0BC4FFA53946C83759D2CF4770B18CCB1547A772E2ACC4B86A8BD676EF8C791BB444AED4EDA2864AF875E924B3FA032C3BB3B33B4FF2722A7E92B3E41356CA248F9715BE720FB6773DDDF6DC913553B8B047FC4CD388659086EE58FCDCDB6D0D7FA44742885ECBE8F79A67AD6C69EC668514D59E989F60CD1B262623A798C72D0BD0751022852267D65495A6091CB640AD9783C6E6A8634A560636CD4B4C7F4861D9CE9F370BEC770A28FC1846854D0A10159C1AB183E8EC3D8E4C2604B6E9018B50DF6FFB735543076C8370032234CACB03926A0205343128A3A553F7B6BBC43CA3257272353385E97AE1F530DE840D552832F977091095887F2FA17B1BDE8400B32DBABC24E20EF3DEB4DE8702A58ADBA0D50342EF3E7FBAFF23BE62240E6D49183DD6A10A4A8E5744A503D07E31D1EC8578FE9663C6F0F42959FD6C88F880F70CF0E5E13C63EA8A79FBE5F108984407C969C20CF2E91053125EAAEBEF3C11936308D5EE542271D7542A4DED989C57DF952F1C3C4AC81CD7D5CA3FF08E06542869D3AEE9079CB25A3861B81420EDC1EFBEABC91547C72CEADEEE1E1448FD5A9AF59817A0D60239806311F1A66A066603B9D9CF6621348891C5AB095F75C0C2CBAF734A3C72BD04E478F61823CAD7ADEA73282EB1837988E4799F60D7E6609CD169C7C54A596E549E44E055CE0AA9FF49C6FB2CB0E186060DE0DCC64159EB010A18A4E971EA54FA ss = C073538230F727A87719AD8B74255824999E463DFA677227 count = 17 seed = 8098AE7A92C10F707D405F7DEA02C2EFBEF44EFA132BA8AEFE81BD45E543ECEC74F10920AE48A40B0653D63532517F2A pk = 97B2806F49F70FFC78EF248C98B0BF1207E16FAE47C6A9D79A637C733613D506B0FBD5E6C3AE101C80CE86D87EFEB5F71B78B1D9208670139C099CFA3BF2C2359E579623648459B8F9B813CB940B6A8CAE8E7B7B3D8B002F9C6D216A88629145084C51C8798756D8EBF64D53B2CA8F49BEAAE96F3F0491321578E0E1BEFAFF22D6A32067A26E08ABF674B949B3A81C6E4729522B0207E6CAD0E553EE4C716907C976E93067C8FCE1ACD01456DF8DBA349E6991B962E5658B64DBD531F8320609017F7A6070065D904776027BDFED3C194E096AE59EB0B4750722AB2F1190681CA7E60B19A48B853438C1B37385AD9AB2865AE810A5B58EDBDC44F18DF03C560B683A122389509FA8E4937D61F8D20205B64A8D3708B96AF8D62A1F22D40110905DDD6BA9BDF48E05F09267F42475C751B508ED24372619DE1717EB723CEB7F25AAC588C1385FF3558FC6B7B9DB53F352C08F61BCE6A918F13D7511DC5AA444C95D4EB2D9AB7831118B82BAEF7CF21D16D5EC1C216364D947F2212DD9D25FDDCC15B9C424DF3FBAF1732A861A3094B3A8E60B41393972DF62283310A9C3E20D4F25968B6CFF6D9CCB65C71BEE0EE5F7F7A64E9A60E32B747B774AF31E69F22CBD990E5EB67C009397008DDF59FC592C1A8E4F12C1072F1B6695D9751EAEB691CFD9152E0C7FBF1B5CD3E72F6A16C06AEB91176145290DD8F5915DBF13F132B4527560F2BB56AD5A801FFDACDE80015474D5E30C0915F764B5589EABBA95B75B08528F1950A70526803D5D8F950636E4A9C3864E18 sk = B12F6FD965EA9C5B947DB80FC60C83D5E232DCA82E7263027C19BD62E5A6FF550F6AA3E88F7FA8A96067F8CDAECEEAC90C2D0B5E277E56E9C405EC9420C302520E0A9CAA76F59A0A6B1638B301A8710397B2806F49F70FFC78EF248C98B0BF1207E16FAE47C6A9D79A637C733613D506B0FBD5E6C3AE101C80CE86D87EFEB5F71B78B1D9208670139C099CFA3BF2C2359E579623648459B8F9B813CB940B6A8CAE8E7B7B3D8B002F9C6D216A88629145084C51C8798756D8EBF64D53B2CA8F49BEAAE96F3F0491321578E0E1BEFAFF22D6A32067A26E08ABF674B949B3A81C6E4729522B0207E6CAD0E553EE4C716907C976E93067C8FCE1ACD01456DF8DBA349E6991B962E5658B64DBD531F8320609017F7A6070065D904776027BDFED3C194E096AE59EB0B4750722AB2F1190681CA7E60B19A48B853438C1B37385AD9AB2865AE810A5B58EDBDC44F18DF03C560B683A122389509FA8E4937D61F8D20205B64A8D3708B96AF8D62A1F22D40110905DDD6BA9BDF48E05F09267F42475C751B508ED24372619DE1717EB723CEB7F25AAC588C1385FF3558FC6B7B9DB53F352C08F61BCE6A918F13D7511DC5AA444C95D4EB2D9AB7831118B82BAEF7CF21D16D5EC1C216364D947F2212DD9D25FDDCC15B9C424DF3FBAF1732A861A3094B3A8E60B41393972DF62283310A9C3E20D4F25968B6CFF6D9CCB65C71BEE0EE5F7F7A64E9A60E32B747B774AF31E69F22CBD990E5EB67C009397008DDF59FC592C1A8E4F12C1072F1B6695D9751EAEB691CFD9152E0C7FBF1B5CD3E72F6A16C06AEB91176145290DD8F5915DBF13F132B4527560F2BB56AD5A801FFDACDE80015474D5E30C0915F764B5589EABBA95B75B08528F1950A70526803D5D8F950636E4A9C3864E18 ct = 3BB61617B616E420859FECB09A333B3F9D022F028D433FEDC4C5F49CBA86F033D7A496F7230FAECACB8570AE90611B13A9EBDA1E05A188B3BA9CC795ECDCD879A4475CD4859D6040ECC757B7C0421DF25ACC027718A7511D485CB2092A4D59B8D6E138B9EE96D4C1535FF0815967FF5569420DD9DF035FC723BA0DF406E8C76C6F9EDB5788F839F87D86997F4756EBD6BF31DECA1846CA019FA18D54848F9EA317D5EC3C158C47D3954E3DDECDFE408F5791CC662F805CCBA3C01F1A643D52E6597035E840EDEFF5E7ED940B25BAE137AAFB1B0956ADF6D8BC5C7D2A9AF7AFBFDFC3D99C59249FCEB4D2456443CCCE530820F5C211685C60302AACC33BB7EB8BF5D8A493A06D86C908EFE6447402AC3D63C33E35738AA853122F008027C5E5FAFB27E19794B37F61E309F1E8AACE8682C5E8A038B5F373C24A9EE37770CB610C1B40E2772BB220F018AA162B4753EAC633978A53523E6DBB576814D0856201572BC7DC90B89B0F684DE3011835207CB473DC33474C717E14813B41CFE83707E9DDE3872E9FDDF90437D7562F36809C1C1354987F78C65D97FC7F30D148E26FF58466725387C54C333E67294DB2DAEFD1739C8F5DB2D6B5756A46322D82E0D6013BC91E780A6B9C87389AB709FDFC650E98F5F2580C60C0E2092A1A39C6CA7184F7F2D2031B27F8D6D9B69EC01340DEB7375D3E97721F31A1E8B36ECF71F01AA868A25B304F24D823F25E80655B83A11F2207A6EF216779881087786E89EE759FCA01EF9F16D150E1E63FA3D407C969234832D23F384F4C43674E31FA7879520EC94D20EDF58242FAAB5DC382A772178DFD42BA0D ss = 751FB574CA608EF66A7EEB2580EB0A2A96C30ECE6BA6DB34 count = 18 seed = D5F23808871544E9C1D6EACE2028362B48E225312F77663E9F78CAFEB512B908CD9E25875D61A16EC615F4B8FF826856 pk = F16B0BCB4C1C1826E0A6DB37AC51CFF516901B972045AA6C7035C0D2CA94C2533515D0A07453E9FBEEE4676632DA59D94D1A25F260C4F5D116823CED2C39CEC648976F8111FCD0D8C59C8831E58199DC6E485FE677BAB431097C953DDC5BE553B0D57C0FCF0363253AC1B57856449F3E51C537F71B5C30A3D0630D023CF73F8223DD176DBA4026320169CB2CC9D0A65F20EC1F7A555C338126703AA02CDB2529F7D1601362BE7060B12D54F37D29369FE7BDD552FE685F81C2A6AA33537D162AEFC6DD6FA80627331C195388FC8D5FC264EAA21AA6D40405134AB32F2485DA2CFB52CCCE7AC3A9F243CB729E1D72E6E574287CAE94BBCE0451AF7D9CCE6AFC64FE6083EBCD662B23B5AC090A31B6D39F4BEBE17087349E576C6F28DC31F1F8D91B137D2503DC3FC81A90D33F617D34AABB997B99D73E589D8B5B5C9849F974FFD40F10BA4EFC2DD62EDA44343F97F703969321E3AE22BB91E1B4B2FA022616A527D763295B9D82641EA5D8B32C6DF6CFB03269A4305DE16D76CE4D1B3A4DA890205E89CCB4A99551AC6DF5B428C0D26A56A139762B05B18689932B9385B6207F884963C0DDC06E9912B7770C59441F9B295BA2BD28573EE4F4180A8A7C17728A166CF1BD60E0B6D0F4EA2AB292642D29C4856211B91F1A87EF3585C265B8973473490D1E510173950BF980B035DD8851B78E2161748555589ABF57AF461BF3B8198D6F2D6F90484FDBB46DB03193158BDF3D7D187A5F7AA18FC4F39F7477733A56BA743A296CF10A569A18F81E3231972F460C0F sk = 9F52AF92CA165FDC38788F2B59BA02E01C8281FF7C1E60504688043A5FE814B04F3029E1BE4E1C0258C3A22FF5B50B2674CC094BA7018DA2A61569845C17D26F9580704792E5BA2904B75298DD866603F16B0BCB4C1C1826E0A6DB37AC51CFF516901B972045AA6C7035C0D2CA94C2533515D0A07453E9FBEEE4676632DA59D94D1A25F260C4F5D116823CED2C39CEC648976F8111FCD0D8C59C8831E58199DC6E485FE677BAB431097C953DDC5BE553B0D57C0FCF0363253AC1B57856449F3E51C537F71B5C30A3D0630D023CF73F8223DD176DBA4026320169CB2CC9D0A65F20EC1F7A555C338126703AA02CDB2529F7D1601362BE7060B12D54F37D29369FE7BDD552FE685F81C2A6AA33537D162AEFC6DD6FA80627331C195388FC8D5FC264EAA21AA6D40405134AB32F2485DA2CFB52CCCE7AC3A9F243CB729E1D72E6E574287CAE94BBCE0451AF7D9CCE6AFC64FE6083EBCD662B23B5AC090A31B6D39F4BEBE17087349E576C6F28DC31F1F8D91B137D2503DC3FC81A90D33F617D34AABB997B99D73E589D8B5B5C9849F974FFD40F10BA4EFC2DD62EDA44343F97F703969321E3AE22BB91E1B4B2FA022616A527D763295B9D82641EA5D8B32C6DF6CFB03269A4305DE16D76CE4D1B3A4DA890205E89CCB4A99551AC6DF5B428C0D26A56A139762B05B18689932B9385B6207F884963C0DDC06E9912B7770C59441F9B295BA2BD28573EE4F4180A8A7C17728A166CF1BD60E0B6D0F4EA2AB292642D29C4856211B91F1A87EF3585C265B8973473490D1E510173950BF980B035DD8851B78E2161748555589ABF57AF461BF3B8198D6F2D6F90484FDBB46DB03193158BDF3D7D187A5F7AA18FC4F39F7477733A56BA743A296CF10A569A18F81E3231972F460C0F ct = 053DCC9B437AFB09C07E7A6B3900A4A732ABE7CA494BE958F5853790B27B346F74371FA1EE2E1DE61655B742EAC18C37AD19E9B4E965EB3FCA65FEB6F93044D024A132A021475C7BCE2857FC253AA6DD5EB0B7495572E4A2E6641C42D21E7AFB7C8B59663F456E05F4466A0CBBD31E68C9ED22490471CE1866E43328F96EF20BD0EB79BDEBF286994F25D58C7141D55A5BD087094E8C8F592F3E7F9115A5760B95983AA6823589E2BE606BB1AAB319643228C59019BA22CC489FBD2434A5767E7676AA344472DD98190929F762105575CBEDDA9DBD0F8F83C321BE4C89E1AA44540B870A0C5B5604A37944083E5B685F684D34DDD555CD15770F8C29B20021E5CD4A260244C9051315514444020822FBDCB4A9B5634CBAC1B003B9D342208AABE36DDA0A866BE595E3E6B7EA9445931BB14048FA81DCDA1E4C36DE7EDA8A1B3C6B8B5D848A8981E9DAB5DE8B07DB2312D8E01D489A4C71F886C910438497802B41D49D8C0C1D026FCF14A3B7B7395F658901008E3A291011CE01BB7179B2BE430BD94FFF0D70750937B6F83B96712FFC87EF9E9772B7E6F54FC33E718DBCC3F10E6E2D0478B308F4AD30C902C87361E39288FDED85353E8C74F704E8F7643D018F486ABC0250921BBAC51B5FC420E77B3C3F3FEFE50EEB0D4670A5FA76B94B2283ADFDABC66820B0229802B84FD1742F688A86419824F3E4FAF8520A2EE280C02326376FE459FA369C4402E54AD6529CDB9EB40A0B0DA4A650776359FE84D3BCFDB73385966361F51FCF75D3D76C7EC319F12B24267A94FBBB06DCC416F02F438BDCD257F72617BC452FDB869AF7421021B7D146 ss = E358093EF74AF52F049DBF6144FB7A2974B6F113C5A07C38 count = 19 seed = 822CB47BE2266E182F34546924D753A5E3369011047E6950B00BC392F8FEC19EA87C26D8021D377DF86DC76C24C5F827 pk = 104C5F68237DAC5EEFD98AEFFA69D559586AAD878050EBA4549E9FA496FE3C3C77DD7A679C1FAAD8940A9AC334D87513ED6C7C919CC5465D59935E114A87EE9C5EAF6F49EF41A694A0BB20C5E1CD13736326F29A66F9906977AEE5619A1BC28F7A57817FACE0CC749B56F47BB7657308AB095696EE235B6BAA72E02F9B7A93795F48DF468CC02C4458AC56C379CFD6301FA096B1A0FF27F9A4338966856E36551B95E9BCE846514A55881E320A23E15512151CA1941CCB43A505A0531EF2AB1DADC3C719C4F85110C6CA34C5A2F9892614941D302769C42D661E73684D13EEA42F49AED8CD7EC961D8948D4EC2BBEBD7C677188F4C84F9825D01BA699C2E9A61CAC7FEAF5BA8689FEED63655C6AB2DBFEE068CD20DD23B444156BAA7B4009AF69F0325F001E3BE1426933C77DBEB1B1F4938988A33A6FAFDD9B8DFBB5C0175234407AE94024217A239A9DBA6EC06CA374F49DDEEE7D059E0BB7B9C26E0E95472B830C36911A9C3DB52866181A71C916A8E0A38679909776E8522B531C06EDBC17C2603DACD7B57F89242436D76C56F32AFE756A6127313C6E84FC7DCE35F013B3D545EFD544E19B7399926FCA42345A06E4130E75BC7E9E93AD5E87F7F3E1CAFF3FB6736C59F75444EB6288BEADFEC9212FB37D6490BA8BA545B6F47B250C0B751B931751385821B399CB0F9C036DEFC761E38C19420A0801F34AEA9B82763907C2096030DD2E2BFB3540F90DA58C21249CBBC3455C13EF3F31A17AAC8788795B6547E5316F0E6A8A9CB806E8CF90C4924EBD40A sk = 851EA90FD3854CBF28FE39FB81F68E4B14345CF0D6EEE7EC4CE772513DF8410D1C0EC046899A777655233E4E1B5CA44E9AFBDC67964BFD5D5E3DBB45E60D03CFD77A9920C166C3AFEACBD5D979279900104C5F68237DAC5EEFD98AEFFA69D559586AAD878050EBA4549E9FA496FE3C3C77DD7A679C1FAAD8940A9AC334D87513ED6C7C919CC5465D59935E114A87EE9C5EAF6F49EF41A694A0BB20C5E1CD13736326F29A66F9906977AEE5619A1BC28F7A57817FACE0CC749B56F47BB7657308AB095696EE235B6BAA72E02F9B7A93795F48DF468CC02C4458AC56C379CFD6301FA096B1A0FF27F9A4338966856E36551B95E9BCE846514A55881E320A23E15512151CA1941CCB43A505A0531EF2AB1DADC3C719C4F85110C6CA34C5A2F9892614941D302769C42D661E73684D13EEA42F49AED8CD7EC961D8948D4EC2BBEBD7C677188F4C84F9825D01BA699C2E9A61CAC7FEAF5BA8689FEED63655C6AB2DBFEE068CD20DD23B444156BAA7B4009AF69F0325F001E3BE1426933C77DBEB1B1F4938988A33A6FAFDD9B8DFBB5C0175234407AE94024217A239A9DBA6EC06CA374F49DDEEE7D059E0BB7B9C26E0E95472B830C36911A9C3DB52866181A71C916A8E0A38679909776E8522B531C06EDBC17C2603DACD7B57F89242436D76C56F32AFE756A6127313C6E84FC7DCE35F013B3D545EFD544E19B7399926FCA42345A06E4130E75BC7E9E93AD5E87F7F3E1CAFF3FB6736C59F75444EB6288BEADFEC9212FB37D6490BA8BA545B6F47B250C0B751B931751385821B399CB0F9C036DEFC761E38C19420A0801F34AEA9B82763907C2096030DD2E2BFB3540F90DA58C21249CBBC3455C13EF3F31A17AAC8788795B6547E5316F0E6A8A9CB806E8CF90C4924EBD40A ct = 2E3B44B155E57778234CBF18D0412CB33183C6C72A4129BEBBF6A8C9C2EF4118B39CCCB008B6C9AE6C9275FD6E4157C43E952A2B20EBAD4A910D8877E1D85C077A098E3B0B343DC271A68AA2FDD5B78A8CEECA9B0310E32EC3AAD35AF52B3297F0CB13D3FC1243E5AE2032D63A3D5AA7DE56276F3D8D582A102D46101FC528344A450BED11B96B56532287CF966C57036737F619D3D88241BEBF4A1DA22549879B035829DEF0677C9BE1B2F822EC578538661845EFA9F160D2636201347402D25EF15EBC1729039E7834906CD9D15745542213F1470A5F979E822EF1A3E4DBD7E157A16B29D5CAD4DE960FBEAE7AB279E25ACD3B76B8A2F8BAE77C9ABDDB8E5F2084F69E2D38F7714E0FDB2AD16B79A8741577486862CDF8AA0ECBD509CC758C31DAAE29B78A765F2EC61E76C27F16144FBB1EBD34F53A03325B2DD03EB5A651A990A4F806E69E2826C1A25A2BE08EC6E39380B7C624658AF77586A45F2901142A648CFD0B048A82DF73FC5DA648D8EA2144E071AAA1496BB5810AF2394BDD54E5F368DF237B0D1768CBE4723FC1EB4C8596E352B8EC0E482366415203818757204FB3EB806693D57BC1DFC564E23A59487474E0D3614DECE571FB846BBBF80F89CF044A69CCECD7C36B5C432637B37229882129E332E6932590CDB4567962BD8C71F80E96E7A12E542E54A8CA63750A02F9DD58CF8EC3782BE28C4254FF60EC2A16110FB06F025A5C155809930124CB2B18E56E5050E4B7B870F43B64D9988B34A4C5935C70C4AAA2EC21C935F8298F9D21025B2DBB411D014A8F87FBAE06560A472C7424B49FBBF025059100C01D4EFF9E9000 ss = 79F89B2F78E1A0A4F622133B07D6DD057D3281CF960F45C2 count = 20 seed = 81401DB81138D6874E91B7C11D59596E4ACE543F5A3471B6FB00999221765FEC3CA057ABE20F03B2D59003375FD71FE8 pk = 0C62284FD17042DC8DEDF238A9D72472B231342A18D42CCE2B9BD350AF67309C7672565586A2F26AB6B89EE8493C23798230CD31301B1ADADED0CB2D86ADEC8E01AA75C44CA7D72F7FA23A07CCBDD33295DB7071ADB6F884EB4F2A757329796650839C98E3F04AC54F2B25E839F9A22653123BF5C6A2999F73D5EC85E04415A03B19536A141E2BBF2F010777D1342E44D523F4AF56C94989103E145C5155934586A240C6B5299ED7095B3A684972682AAF4215DAAAC83654F22DF4202DE37D5B51AAA93155E9A6A1CC4C1EB678269133FA7C57216E379E1B63F8F79A83E43ABE134B0AC207132751220AB2109B7472D541636EFA2EC58084D6ABE9B2880A68C4BDB5884E44718501CEA4AE9DDA24C0A4017900C23FEA7179E347FCE558C62DE22D0EAAAD90940F08C32CF42B57F581B066A90B5022EB53A8FE0F22DBC05F99FC3BC64D469EA5D10E9EF6BEC6443B898F4BADF7FB3E6304FA81E3D23ED15380789D0AEA12820D1F732D065D627D3C425DD66B728BEEA3E55A8DBE49AAA633C0E2D78BEF6809DA621EF6318197D9E42E74152CB30B3B7ACF97ADEEAD6BC98C8C35691AA7BB8451562CD6A99A933FB45B84A3C5F7498C5E89A072FAF5D6E0BB5B31721E733424D447993137FFA95EB87FEB9DAF49EED13A0F82310F2B0D0F8DDC0A0585811133DCAB41DC8014FF91E0AB9AFA0BCB33CA17BA2C22B7C0769ECE6D6E5AD9061969ECF4DD6706A56F73651AD3660D9E30DC076B423520D45C7C4DCC7746154C56149BBD3F0D2CEDDFB199CB820809C221 sk = D304C9389CC973477F169788ABCB9D511F843219D246A9B587822F422A70C2386590A2E5C7ED86CF2C5C2A898662BC9A81418720BBB632EF9CF0B845ED052D73AFACA1DF98112891F60E2BC740C99E010C62284FD17042DC8DEDF238A9D72472B231342A18D42CCE2B9BD350AF67309C7672565586A2F26AB6B89EE8493C23798230CD31301B1ADADED0CB2D86ADEC8E01AA75C44CA7D72F7FA23A07CCBDD33295DB7071ADB6F884EB4F2A757329796650839C98E3F04AC54F2B25E839F9A22653123BF5C6A2999F73D5EC85E04415A03B19536A141E2BBF2F010777D1342E44D523F4AF56C94989103E145C5155934586A240C6B5299ED7095B3A684972682AAF4215DAAAC83654F22DF4202DE37D5B51AAA93155E9A6A1CC4C1EB678269133FA7C57216E379E1B63F8F79A83E43ABE134B0AC207132751220AB2109B7472D541636EFA2EC58084D6ABE9B2880A68C4BDB5884E44718501CEA4AE9DDA24C0A4017900C23FEA7179E347FCE558C62DE22D0EAAAD90940F08C32CF42B57F581B066A90B5022EB53A8FE0F22DBC05F99FC3BC64D469EA5D10E9EF6BEC6443B898F4BADF7FB3E6304FA81E3D23ED15380789D0AEA12820D1F732D065D627D3C425DD66B728BEEA3E55A8DBE49AAA633C0E2D78BEF6809DA621EF6318197D9E42E74152CB30B3B7ACF97ADEEAD6BC98C8C35691AA7BB8451562CD6A99A933FB45B84A3C5F7498C5E89A072FAF5D6E0BB5B31721E733424D447993137FFA95EB87FEB9DAF49EED13A0F82310F2B0D0F8DDC0A0585811133DCAB41DC8014FF91E0AB9AFA0BCB33CA17BA2C22B7C0769ECE6D6E5AD9061969ECF4DD6706A56F73651AD3660D9E30DC076B423520D45C7C4DCC7746154C56149BBD3F0D2CEDDFB199CB820809C221 ct = 324B0EE51F0FD301E3B0395B1A91896B01385C5CEDB918111A3C19137CD6B773D9A38C9629E83B710E9DB780C34BDDEB070AB50250E2EBDE60D7B6D5E9A278BBC63120AF653E8AD30DBEF839A4655E50BD538D79F6F7EE97404BC8F618576D0E4617ECB265181799B1D39F09D93B77E3AF4C4E10563DD83DA8639FA23B67EEB006E17A6AFBE1C15B8D2C7C7EF6D8B2C967A512391F640D9C21560B1B12A55D1FA6B89D20AE2A40DB68B805A9FCB452B3B73D0A1726E1F700007E1E10A21381F79B1D84CFB8CA0432E27809F01C30CB0CEBCA8DF9FB790295A03760FC2DBE70E80FE305DB03E4CB9FCC4D21C944F205C6D8E1A392380D2DEE83BA8DEA3DEB74982A163F8371A891CCE04C64324B671F77E317F81F62241821683C1F9E248EF3524B111FD6FA6BC46BF754DC5885D45E99A1F6CECCEF1AF81B6242AF2566398555825FA6E0156220F8A083ABE53A2461542524CA2B31A7B48F88B5319ABC8207E7B183663C0A037B2B4A76BF9746BF35BD112E2A7187E2A72342774F1BDA146FA9391DA467B107A0BE70A32B59A260352024EC2405F2338799B48F7A237ECFBFB0EBEA84C46517360EF6CD7FB10AC0169B32739AEAC6B40AE78CA190F353C8C724B2F18641C64F39889F1D5F1FB0670218CAF03B93BA424E4DF74F076E152ADC2E5711A0E85ED0A467BCC91ABDB514F576632402F00581C79508A92EEC8CC85CE595E5068B2E15CC8D73387B63CA3FCFE1661EA5EEDDA32AB3ACBEA1192D27C9F1BAD84F54195BC2E20AC4D20EB39B9BE6D57D953AAA6BDD640EEDFDEFB3AEF1A01DA0EBD11454006FB9CD09CA7D45CD8C139910C1 ss = E4EAAB64C432FB26B43A9D751E5B155A866F63EC1597A54E count = 21 seed = 30B5DE5B73681EC08AAA03F6F2D2169525D25F4042A5E3695A20A52CA54927B85F8BB948FC21DF7DEFC3910B28674994 pk = AB189E31BCD8B8CD0F4029BB4D1BC72A42BC3F659E7F13840C52A9E31EA52E01FA747F74A2724C947873CEA1EA0581A813D0874724085C3497C5382691789C334A7B30F8A76A04FB3BE7D55354B45F640C03CBC0B42116BE1E7E5877906B1757FEEEB28612CF1959154327685A5C9E7D1DA85E8061FE0DDB66B42CC4CDB12CF644F836516D83ED517B1AD60228455563A0478A358C2573539C983E2790749D4CDB9FF5C7027A475F31A1399A5D538ABE039ECFB072EE873C33E1C86896C27648C95192D207E78C81B9A78AED8D2253C1037DE8EC219D58F5785C188B69BA00EF16073F36DC53EFA87DA3C19F34F40F9370BA7943D61218B989C07C5B95D2C69AE06B17C5407A6D0F7015143ED3B76ECACB8215EF7DD9385F1B51B44C055702791B7671ACDF74E273CE6DB96A8F83AD40F3BE1764D3ADBAA82D11EAB71554680C0558D47B6509BD9D5702BB07178FF7CB136EA425F43E6E739D40D176BEE8340EA270CD78FC3A5720DB699BD011ACA79D57A8CEF07BF2364ED65854B41F5CC72AB2E3AB67ADA33C42BDA175D10B9784C3901475464D6F711C4C65F9ED64668A58108B52D210AFE491CFBFA39E6FDD9DD4292307323E02633B1322331E19432E603939CD47889B3DFC0BBF910279300540EC631CFFC33F1298997CA6C4C69F0D5547FB6FF1C205D4658C8AB422F3A5E75402F2BFFAA62CCAC88116CB0FC93E4FBDE2A253227BC7FB577B19695E310792A9FA09D42C82576FC1FE6D076F51E5B3A21F571419C1315AD7E5CBB1D76F98ABDA679EDD39 sk = 89A6E3BE304A3518FB82B18CA730F0B359CD6BA90664A493FB4F8EDAF965B9C3B6591121E25D64010C25A18676033E1D7278AC5F2D0B43A31F3A4156AE7104656018DC349AC67563849A29C50DB66103AB189E31BCD8B8CD0F4029BB4D1BC72A42BC3F659E7F13840C52A9E31EA52E01FA747F74A2724C947873CEA1EA0581A813D0874724085C3497C5382691789C334A7B30F8A76A04FB3BE7D55354B45F640C03CBC0B42116BE1E7E5877906B1757FEEEB28612CF1959154327685A5C9E7D1DA85E8061FE0DDB66B42CC4CDB12CF644F836516D83ED517B1AD60228455563A0478A358C2573539C983E2790749D4CDB9FF5C7027A475F31A1399A5D538ABE039ECFB072EE873C33E1C86896C27648C95192D207E78C81B9A78AED8D2253C1037DE8EC219D58F5785C188B69BA00EF16073F36DC53EFA87DA3C19F34F40F9370BA7943D61218B989C07C5B95D2C69AE06B17C5407A6D0F7015143ED3B76ECACB8215EF7DD9385F1B51B44C055702791B7671ACDF74E273CE6DB96A8F83AD40F3BE1764D3ADBAA82D11EAB71554680C0558D47B6509BD9D5702BB07178FF7CB136EA425F43E6E739D40D176BEE8340EA270CD78FC3A5720DB699BD011ACA79D57A8CEF07BF2364ED65854B41F5CC72AB2E3AB67ADA33C42BDA175D10B9784C3901475464D6F711C4C65F9ED64668A58108B52D210AFE491CFBFA39E6FDD9DD4292307323E02633B1322331E19432E603939CD47889B3DFC0BBF910279300540EC631CFFC33F1298997CA6C4C69F0D5547FB6FF1C205D4658C8AB422F3A5E75402F2BFFAA62CCAC88116CB0FC93E4FBDE2A253227BC7FB577B19695E310792A9FA09D42C82576FC1FE6D076F51E5B3A21F571419C1315AD7E5CBB1D76F98ABDA679EDD39 ct = 5CF612B89B756FE3C69E12D3B25CBBB437C55E7B1ED239B906FA6CD10A9CA59EB22349EC0E146F271C75D03BABEE84CE6679DA2576F3F424E8A57D3E2177A8EB12DAAAF7069A9C82F1CBFCDC7D80101C4B0029181146E06735C1F0AC3D1659BFA31038C358B426835BC5EC0FED24BF8A2BB5DE533F928063AA3FADA34AB4F4C81F167005C19D21D55756E29878B3AA6117305BB8B00B19998782F41631CBB93C7D8FDBE4DB346A503983040F892AFDB36830C08492EA40397BF91F415596F9043AA99238EA900316479CE2A5A74CBB01809AF91FA10EC52DD81C24C73D2C601B27204D8BD4A0144F6A9FAD667570CD738F58986E305E58F651E5B081134CA991217B5D1208E705C352B1906FDC94BA47EE23AAB4FA86AE03F0280EDDD32A8C066F60876EFB3D239B67B9D8305898FE5CBF7DD1499F77263B2385AA728F2D4EB3BAE9855788C70811409F6917378811F7BB3894F855E007C2B8885F25A3B9B17CE8F79FBD460465D1F22761D38174A38EC1F4DA7138674137A00DA4C1C258387F8CA3602BBBF8C48B7DDB093237E8B594FD64CD5DF99224A39576DDC06255823FD4A5F031FC18D7FE41792C8E706ED2787085DEF6A4481C8E40FA1EB513014E747630481046BC535744C68961DEAFE44B882C57171B1413FA780A56AA0ECBF819E641D9DEBC8D8A9C4858CDF27C67FAB1ECF4D1DEC8C19075E3C897776537C01A93EB91D5C47EFDE56B32A122E0D9542D0340434E3EAA92A4FB66AC49675537F120801134F327827BC511E31C8502B5209377244BDD028EB30FADF263BBCD06160757D80F4A659FD24D7C5331238A0F939A95DFA6 ss = 230EEA81065392B1A441782E666D14454C21B6692DA93CEB count = 22 seed = E335DF8FC0D890588C3E305AC92C7160FF199E07C85760A828933750E3FED8C83B0DBE802234481ECF890A32D7A2884F pk = 066B794F45B538BE463BBADA64400488B376F71855140F90E892B91312EFCFDC7A41B96902C64C7257B13420FD93FDD1490ABED72BD779A6D81AAB7A557D7DDF5D284F269CAC1E12A9DF8E500EA91CFD57688E4EDAFA43731AFA30781C2EC415AC70B28E913EA4AE6681BA9C3AA524291BA77597D0CDF0D067A6B4A4AC8BD5D9F585981D399E471E8A59E73828B9817E37D888870E3891542E92832628F19F72254EE476BFF5191BB61F6E0623112353B45F47E6C712C4413C4D24643C86B63B898F0AB59D06E7851784F2C0697502CDDCAB39490D88286479AAA0F457C6844417E3FCEBB9360F0D6DD98EF39DD596DCA8EC0A0252680CB438AC6843949357B2CC12A8444BEC56D1965A23087AD2DEDDE17A9B0EBD973EF6180B98C0F340DCBBDCB36F3676F5CEB75B8D0E5998C7452247130011547D2BA59221F205F58318B19CC1EFB6268AE9FE676D9CF88E8FFDCDFA01ADC30174B11C5661FC5F4630EF57829676925BCC0391B0C2F19FEFA895554C3326024718A83F3794404464F4F10F88DE65595A9A07F0C3FD47ADB3FD0F24DA538FF9D202FFA4E021C60650E5690917D1A0E5CB3BC0452021E18A4A11E1E9E7B708641754003E4170DF86622BECC59874157CF75824A2B4701E710CCC93A3ECEEDC541E0D3C19119F06FA75FDAE28C33A8C1F313FCE627C6D43780E7838353E0069CE892FFAA35B1279B3761748609916D494A5FCB1A238342C07CF19CC2AB84D05D0BB5394A9B8142793B1FC29D4257A589B16BFE0EA6E9718D6F72E03D6EA58945E sk = D569B935CE015C85F792F8F7FB0D83C4F53B492959361DD4F75FB764D656450176EAE84D11C4528382828F7A689A0D5CFF87B8CA0BBA97FEACB39B935A8788CBD0C65DDFB25BCBA0941A944F63BDDB00066B794F45B538BE463BBADA64400488B376F71855140F90E892B91312EFCFDC7A41B96902C64C7257B13420FD93FDD1490ABED72BD779A6D81AAB7A557D7DDF5D284F269CAC1E12A9DF8E500EA91CFD57688E4EDAFA43731AFA30781C2EC415AC70B28E913EA4AE6681BA9C3AA524291BA77597D0CDF0D067A6B4A4AC8BD5D9F585981D399E471E8A59E73828B9817E37D888870E3891542E92832628F19F72254EE476BFF5191BB61F6E0623112353B45F47E6C712C4413C4D24643C86B63B898F0AB59D06E7851784F2C0697502CDDCAB39490D88286479AAA0F457C6844417E3FCEBB9360F0D6DD98EF39DD596DCA8EC0A0252680CB438AC6843949357B2CC12A8444BEC56D1965A23087AD2DEDDE17A9B0EBD973EF6180B98C0F340DCBBDCB36F3676F5CEB75B8D0E5998C7452247130011547D2BA59221F205F58318B19CC1EFB6268AE9FE676D9CF88E8FFDCDFA01ADC30174B11C5661FC5F4630EF57829676925BCC0391B0C2F19FEFA895554C3326024718A83F3794404464F4F10F88DE65595A9A07F0C3FD47ADB3FD0F24DA538FF9D202FFA4E021C60650E5690917D1A0E5CB3BC0452021E18A4A11E1E9E7B708641754003E4170DF86622BECC59874157CF75824A2B4701E710CCC93A3ECEEDC541E0D3C19119F06FA75FDAE28C33A8C1F313FCE627C6D43780E7838353E0069CE892FFAA35B1279B3761748609916D494A5FCB1A238342C07CF19CC2AB84D05D0BB5394A9B8142793B1FC29D4257A589B16BFE0EA6E9718D6F72E03D6EA58945E ct = 23EDD1860AB1A1288D6A1FB073ECB71898EABE79D009459B30ECCEDB130259250B7945FD2C0DC618BAAAAA65522C230853A6B7436E90B48CC48E18E569F503B0DCA7B9F59336A8A8FCEED8470E990861D4D5DA3C8CD8F20650D1FDD4F1582544696CC0DC2F50C0B2109A884BB93A415D8964A8FED436A4A0C7A7159F752B2368DCF583AEC354F2C51D41CE6B1B5B3AD7D9BF176ED775CEAEAE370289557D2C98E7ED0EE2508EAB98EB50712448A6DF134970F1FACACD27B8C6A7292727345B804E38BF271EB49BEECD19358AB9FCEFF810EDE8D308DAF635C564BD583BA1DBF76E6A3A7F25681AE9F2C3D6C030056A4CA7807BD90E8B9D675CAB7359A0EDEAA4E384BF8C7B031B4EABE3C3A23D425A97393654E7AF6D1AB6AC63E10B5332081487C84F4ABD493965301E86ABCB0DA58F83B63C53F320D113B7ADF8548BFAE2AEAA6B59DF76C55E323634EBCC05E5043CD03353426647918C82BA82961648A1184E44543B52BACCFC6693EB126E520DF0C7B37567E2DBEF44F7A731E02A97572196A895F87BBDFB96E7375157B8D6399D612F7C6A3A667AA87DE1977F2F181799C7F550A200A65E37EAE6D20738E4F1B15C92F6977A66BD2DAC0D54312984705CB6E18251EDC511881B770BCDDEFC1F15694CD0CF0029BCD44CC874BD9CEA02D4997C982C3B7BE623BC376401B8F2F684CC92D8F5A97D46D3A2F776D1758B2F5E80954FF8476A88379070497EB71AE90F841CD7C03CD8A7C2E91FBB5BBEB4F30FB0E8A4887FBAFC05C6401B700BC96D460CACDF191E14FB9A50B3B26F0F758B17D3BC0721FD9624610F8A5EDE5279573F7C5F42E5 ss = 3438C79DDF4C4EA5908DEEA2F7F59124C065CF7B9C5CC245 count = 23 seed = FBEA1BC2C379F4F8FDCB0DE260D31CDB064C9EA9B1D6DFBE91B3692ADD1D34DEC9C9FFAE7BF5E72ED2743BA3F9F2E43D pk = 5948716591E7610B13C33FF3700E77907D713CD732D2A6CDAC9029AD6C02FF7CF461BD627662E5E33DDD9E005B6D4A6B60187E951C5FD35101D1EE9BD58FC1EBA6598E14315E3A4A83643C1DD383E63EFD38921D3A36077C37860A37A36FB351BC4CE1BFCBE6BC80F4A17F43BD7039D4B88131CB71CCFB26BF09DA9A02653F56D2FEBB7450127F0021500DA54F3F4556F7B44A1237E9B55DD4FB5A77022C077756A3855360D831CD8498F6B77E7CF8EDFD1883665ECB0A7A762B86273A9A2B952FEB223D1DE3FEEBC7031D4B8A37AA37C1B46523E4DE38BB7CA69151E19B4F860DD0B1776E59EB39831BAD33726BC67D7088BF89D0B607E48B027A556844673D6F39461F566131534324196F43F881ECB46FF1FF3ABE3AFF2E63392375489BD6401AAF1D47A5B9D69ADF2B3FBF351A90F5BD3228A887C6A857D09BAD6536CDBFB27D2550F440E6D15CDE8156A31E4656C9F01EF7A26E9EDEE25219C0125759EDE12D01896B9C891761454A21A37AA934A738DA144C9CF26A17F10072811A5435F2F7FB4CCA8441EBDBA871E47F73BD54A08BAE7D80172711321CB761E78DC9F79D46DC2BA5689A5CE882844704DB5E6E1D670AC52A2E05B4FB5158E6223F1D2C50DB12963E101A76271CBEA210E4A83C09AEAA4648391DC8AC78F38F245472D96E18C288CA820646309C9CD0273F3B95E4E63C1BD93F4D760CEEB10F97B2DBFC719B85ED8F31BE31F4E78BF4143D7000AAB14C16310CBFCD3EB2149F5A93D1B1C469454DF77E7ED6C2857BE73A8C9D28FE6EC714 sk = 5CBB141C2763425C274F7404FE530D9116E08C33F9F200A20B011CF563A28990FC9EBBE336DC464489861DB8253606971BD0A9008A433ED17752D0402378155291D745C4BB3A03D40D4A65330CFDAB005948716591E7610B13C33FF3700E77907D713CD732D2A6CDAC9029AD6C02FF7CF461BD627662E5E33DDD9E005B6D4A6B60187E951C5FD35101D1EE9BD58FC1EBA6598E14315E3A4A83643C1DD383E63EFD38921D3A36077C37860A37A36FB351BC4CE1BFCBE6BC80F4A17F43BD7039D4B88131CB71CCFB26BF09DA9A02653F56D2FEBB7450127F0021500DA54F3F4556F7B44A1237E9B55DD4FB5A77022C077756A3855360D831CD8498F6B77E7CF8EDFD1883665ECB0A7A762B86273A9A2B952FEB223D1DE3FEEBC7031D4B8A37AA37C1B46523E4DE38BB7CA69151E19B4F860DD0B1776E59EB39831BAD33726BC67D7088BF89D0B607E48B027A556844673D6F39461F566131534324196F43F881ECB46FF1FF3ABE3AFF2E63392375489BD6401AAF1D47A5B9D69ADF2B3FBF351A90F5BD3228A887C6A857D09BAD6536CDBFB27D2550F440E6D15CDE8156A31E4656C9F01EF7A26E9EDEE25219C0125759EDE12D01896B9C891761454A21A37AA934A738DA144C9CF26A17F10072811A5435F2F7FB4CCA8441EBDBA871E47F73BD54A08BAE7D80172711321CB761E78DC9F79D46DC2BA5689A5CE882844704DB5E6E1D670AC52A2E05B4FB5158E6223F1D2C50DB12963E101A76271CBEA210E4A83C09AEAA4648391DC8AC78F38F245472D96E18C288CA820646309C9CD0273F3B95E4E63C1BD93F4D760CEEB10F97B2DBFC719B85ED8F31BE31F4E78BF4143D7000AAB14C16310CBFCD3EB2149F5A93D1B1C469454DF77E7ED6C2857BE73A8C9D28FE6EC714 ct = 794BEB82D771F6FE16DB3181DA9F2FE38AFBE619BF5E3426DC23429B4E5493DDAF9FBD925B4345B2D80AB7933385C8049FBE09FE44725A0D1B7495E0F39EC70E29CBC3B0607BC205B97887ED4DC55A01B0B45C93B40F38E045C7671CA84A15A5F3A6F2E980A1EAAF6A3FD42782A8DB7B482027051E29DCD96FD96C05A10F0A0A247301C9E12B780F386D6D8D01011EE86A5C54B98C725CB1AFBE9AE393B62304AD650C15356BBF0D614E7E564ECDFEC6D5BC6C1B87466C21C0048769AF71727CBF8C4E68C4E701451BACDC0DCDABB357DA96A8FAF0CB85C830D0924AD60444075EE07D89B86D2C6A1DC76518C4A12F0A7621B3DE8C5FCDD7CC4DCCF5DB986562EF9BB2D485CB9692688DF2F03EFBE1E5A34FE08C38FB6F7AFD1F40DB315941D9D1C21ACF4C8553FF9A71343A541557FBBE0C5F212B671163F8A415B02737001B90AE999A59F7F35E0128FB0B99A91B92E0CE8023A433A913F03E4101B8501108A4EAB2ACA2B011F19E0D1B19C4092335E59333A7D998234E8A44D7AE434C41E9627D79A6AAC1CD166C297E7BD17338BC32212214FD793B4F05D8A93D555C7207A3C28A2AB54E2EE72993D038C2C0D7F886F06E6757914723E8076767D02D6AABB99A4C439097791AEDDEE7E4C073DF3C87F3F0F45A03873BA04D92C0C2CA3F749AAFA240680C54A71ED1B3DB0795A0D7AF569644F0D23C6660C98FDD3DC9D025799B00F0032EAC1F533D42B6452B16483623D37D27D01B5DBB10F8321CA0A225389F245B0A2157D60A7FCA0008D850B1C08D893BC9FBD3BD662B5F77CBE783403C61E7339D9097731504E4B4F87552FD0ED04E92 ss = 83C993D07323FCACFEAE0465AD9E2AF26408AECE821BB8A7 count = 24 seed = 7E87FB886BC3C7C9FC12569F465D2ECD12532E76CC27C65644C8D3DD603B0CB2D036C5974E675058F271D5C82AD7A813 pk = A91C117DB0A567F7526D62D721B89450BCCC6A42A1D1F9D9C708613104EA64D7C04773C0896975FA5FC930398A1CFFFB8DEC230475711C02A24C58BE9D94B2998289D558F881AE02BD7BAE2520864C87E9132926670D24C7F6AA37497C153E5732E039C830E074A1959405F2F25C5AC5BDCCD60CA392C2614C990C2B2862A5BD2CEF08C2B95F76676F38FEB4562006E3D905C736069A96A94749D9627EF4E22DA58B6AC1A1A38ADA6ED6DFE2653DE6E7C55879500F7A6D688DBF2A5CDC779A3CD66315124C2279A4B20CE41A2A060AE5DA9557686CB20CE4CDD6BDAB1FE38449ED26F261CCDAB75C7580404EDAE5F1EF4C6DEA2824C7B9F42BBE73B8C6B34DF109AFEADFB8CD28807BBC1EC2B7FEFF1665F8166E7EF9AAA0CD592C50B959C3BEAC9760FDFAFEDCB63793D4665BEB346891EA8EC1D4C1559D83777B29E6A915033441C358B367136C09ACC0E974470176697DD4A4683C353DCDF4B5586195433E0AAFD6E33D2E139185AB779E095869CF1EFE8CC13A73AA6CB642BAF29A9AC8BECB65CA2128800ABF8EBF3750BC11720604D776D59A65947EBA20CB2286CB70CF7DFA15A40420A213B25A6F2865C89CCBF98B242425250F820713BE9B94BB1C2D005284F61CF014849CCDDD57E5968BD7B08309B2AF093AF2F474421E0AF395B94C0D438A9BFF35E016C820872C5DC449A5F5778A5579D1B1B01B175159C200AE26DF763B35D7104E792748A02544C32659581C305A4F38DA2B6336E0E6EA7857D19F58D0597C4DA35A0BB2478B369A0803BFDF20 sk = 293ABB6D1C207927945417CF84883EF010823E11B487ED55239E466E83696D0CFF8563038AAD865A817CAB9CE98846BA75BE9363718ECF5FEA538AEA90B2A558FF5DCFF670AB5482D6734C622BDB0E03A91C117DB0A567F7526D62D721B89450BCCC6A42A1D1F9D9C708613104EA64D7C04773C0896975FA5FC930398A1CFFFB8DEC230475711C02A24C58BE9D94B2998289D558F881AE02BD7BAE2520864C87E9132926670D24C7F6AA37497C153E5732E039C830E074A1959405F2F25C5AC5BDCCD60CA392C2614C990C2B2862A5BD2CEF08C2B95F76676F38FEB4562006E3D905C736069A96A94749D9627EF4E22DA58B6AC1A1A38ADA6ED6DFE2653DE6E7C55879500F7A6D688DBF2A5CDC779A3CD66315124C2279A4B20CE41A2A060AE5DA9557686CB20CE4CDD6BDAB1FE38449ED26F261CCDAB75C7580404EDAE5F1EF4C6DEA2824C7B9F42BBE73B8C6B34DF109AFEADFB8CD28807BBC1EC2B7FEFF1665F8166E7EF9AAA0CD592C50B959C3BEAC9760FDFAFEDCB63793D4665BEB346891EA8EC1D4C1559D83777B29E6A915033441C358B367136C09ACC0E974470176697DD4A4683C353DCDF4B5586195433E0AAFD6E33D2E139185AB779E095869CF1EFE8CC13A73AA6CB642BAF29A9AC8BECB65CA2128800ABF8EBF3750BC11720604D776D59A65947EBA20CB2286CB70CF7DFA15A40420A213B25A6F2865C89CCBF98B242425250F820713BE9B94BB1C2D005284F61CF014849CCDDD57E5968BD7B08309B2AF093AF2F474421E0AF395B94C0D438A9BFF35E016C820872C5DC449A5F5778A5579D1B1B01B175159C200AE26DF763B35D7104E792748A02544C32659581C305A4F38DA2B6336E0E6EA7857D19F58D0597C4DA35A0BB2478B369A0803BFDF20 ct = F71DC266D48D667183975F4BFE79FE594837F9126CADB08B2F54EF1BE1F59DFC38B71FCDD8D0F48E2C3DE373271189EF8119C96C32258C6464038EC837C5B22702486D6542D2C35ABA4556F950302B001556DA9C3CCD928BB5DCA3E2A037F2D7A8911BB5CED5FBA09CA0C45E8C9A8E47674EBA4C9D56D703E91522E8D91CC10FB277E89B82D24700B4AB1BAD69BB162AF0F0D425AA6772B9950C06322393D685946FF4468DF652841EB1ED0AF162498825770E6C4DA48F99F1C24E1E3DFC45B114BEF2D17D4E7231608052911B1A82A695E08EA4CA52AD288C7961231007419C432D398F2548560924991AD3E28C11907E634C60461602DA554360CDD1C990817079371EF881E1F239AA17BA0E34709EEF7C655212F3CCFE8C5427437800C8F69922AA1898E1CE2A2E2A94B72D1019D401EFE4BBFA6950491979AAA7B0D01FBC73D42222E8838E293C9913EC1DD01B74F27253701C75DC89947F05B814500A3095BA283D2C3B9B636DE7C25C94CA8E936667C2FEEB9DCE32642F62F87C2BFE88EAB82EB4464B3631C88F766992A3BF75EA47BA2417C8B5F54A216BB1C77EE4D87E640F0C9C1C97B74234844B97F1FA109906D3357A214FCAD790868AC0ECF11168760C83E854796ECC0E11215189857C514083C04A53311074886D078AF6676AE56450C2765E8061E8980CB20184E10179B50F17D620BDD321B8909B561C2FE15B59FDD3A430A24F6CBE22720D317AFC6D8AF5F55383A8E38F92E8FE80463320E6C5AFDA2ABC9233F7C7F31DE46482EA9F0BC7694D75B10CC6C37D4D6BB5298E1A4D418DABF0C12EF3A8A200B6AA6AD1CEB8701C ss = 43C0FB7D80F2D51826D968214A9A2F25E46E060682B283DA count = 25 seed = AD1424E804F306C7FF513DA4C1E8D445AFCA7BC942FAC5C0B335733AAF70693712ECBDE26EA726EE0F9FD9D52A83B1A4 pk = A30A7C745A1C3137DE697F84F3AE60FD6C069ECE9ED32A43A931AE2487D78BD35453B9BA755AE1004F75E759F5E0FF3CA4D80E7710686DAA6C59B15C954CC47C18514E06341C03CEA29F9F58B6B966E17785D8EF3E3A7B9846E6304290311E0B624E6227A9CCAF064CDF4275B213899951F1BF27E508A7E0FB4B5A6EC0EF700D192E02B8A917774D779A744C9358BCF78F123D88D8BCBDA4264E5FA661C700DE8C23AADF25E4E97E7D7EEDEE0B4E7B52425D1474389B7ECAB96BA059894B32BCD5AB804197DF5921447DD4C3ACD007EABD8AC376873BF048B8CEAF9FE9B21C1946C6A42B25E7694398B7D06CB6A6E3139891639D36F4E75C325FC73B5F7A0BECD4BB5C0F75F316DC287F7D4BEDC87661C4BF247B1535913C7D211F03ED23C2EA8D57961378B75FC2F266B4CEEA79A071C7770A6DBCC2AE78274E089F0E903232C01DAA79D2C4B19ADC20CD2BF9488B82977A8B96BA2F37214A7289CBADAF3BE904879BEB5B75506908370E69DE587010AE6FDFBDB688DC6B1DB63937F9A838F934408D668BDD4C82D366C2B172CF65F9127BA4FF20DC7022CA6C7196F70BC73FC683F6FF4AA0CF6A35F55E287A222CA4B3E7B77A29E6F25CDE46F915084F34E1B050C022B8F11D8CE833093B44D94FD75F1D1D5E4217355C29811C3BF5FDF1AD4229C06B769571023AEC5112B0D830ADB4C999FBF086C1A7976AFB9568940923C5A804DED3BF1AC7A99CCBB8FF73CD399E72C5A6CF6272EE7E4392D4B7C6EF8E4394014C15CD500BD883ABB86751159B3000E202 sk = 74D87C7556F2671F2D666854A4D6E073E69F35421E6E1A428CCCEA49C37F972CE1FB7456AC0AA1B97068F452CBA64EBDC138BCF5D36B0A0FADA2A3B374141EB99850E03CA7F436DEDA9D54E13BBA0203A30A7C745A1C3137DE697F84F3AE60FD6C069ECE9ED32A43A931AE2487D78BD35453B9BA755AE1004F75E759F5E0FF3CA4D80E7710686DAA6C59B15C954CC47C18514E06341C03CEA29F9F58B6B966E17785D8EF3E3A7B9846E6304290311E0B624E6227A9CCAF064CDF4275B213899951F1BF27E508A7E0FB4B5A6EC0EF700D192E02B8A917774D779A744C9358BCF78F123D88D8BCBDA4264E5FA661C700DE8C23AADF25E4E97E7D7EEDEE0B4E7B52425D1474389B7ECAB96BA059894B32BCD5AB804197DF5921447DD4C3ACD007EABD8AC376873BF048B8CEAF9FE9B21C1946C6A42B25E7694398B7D06CB6A6E3139891639D36F4E75C325FC73B5F7A0BECD4BB5C0F75F316DC287F7D4BEDC87661C4BF247B1535913C7D211F03ED23C2EA8D57961378B75FC2F266B4CEEA79A071C7770A6DBCC2AE78274E089F0E903232C01DAA79D2C4B19ADC20CD2BF9488B82977A8B96BA2F37214A7289CBADAF3BE904879BEB5B75506908370E69DE587010AE6FDFBDB688DC6B1DB63937F9A838F934408D668BDD4C82D366C2B172CF65F9127BA4FF20DC7022CA6C7196F70BC73FC683F6FF4AA0CF6A35F55E287A222CA4B3E7B77A29E6F25CDE46F915084F34E1B050C022B8F11D8CE833093B44D94FD75F1D1D5E4217355C29811C3BF5FDF1AD4229C06B769571023AEC5112B0D830ADB4C999FBF086C1A7976AFB9568940923C5A804DED3BF1AC7A99CCBB8FF73CD399E72C5A6CF6272EE7E4392D4B7C6EF8E4394014C15CD500BD883ABB86751159B3000E202 ct = B8312BA209074667213C95F13F30E60F20E36A13B385E95D8EB0575168536294BE2F54A0D495C83EFB291FC51B941868C4E8C9278AAE9AC9C772BFD56D153FDFEC0EE0E4A23FCF00ECE036AFC8D06CB636050AFF384F33AE196D07929E0BEFED858BF3EF65524BEEE00B5A9C289D74E809D4DD5EC239FF044A7256CCD1CEDEE98E075A57AF3C57DCB431A472607790177F9AFF12DF26869CBD53A55B5571B5EE0745D96EA2B1B0A9476B01368F429BFC41CF359D764F288750975E05FC8F6D7E05A643CA79AE87903DEB51353764403AD381A5C3AF52137EE7C88F572EBD4CC9A0FF98203EA58A7A4C5EE2821868B6AF708FD8E2CF4634ABAF1B17BD18746E0D0C4D343F71C6EA54B46B3914651B64DECCD2E461BA99678A02140DEA7A100C45378E5A89AEA46FC88827FDBF02799B90A0BE0505910239840E5D53F115A0DD5291E80C7C7BEFE02CEAF1F3C942CA9F91C71112B9AAED766CF2E3F6CA1D88B534219D7F73FAADD8BE31648E82C451B277BD2D5F125609BD1EE00B8C7FED7751266E18DFBEFFE3162C24E30FC98409DD77A301322BD85913B83B882B12C119E0849783BDBC38874C5BE783315110C857CF2FB1189E2092A4EEA03F28DE6F58255150F72D6904D3190C328465FF1ACD2EBD54E3DC97BA044EB836FFFE31D3596009D4232BDCC43951E211B731FA392AAE364FCA98D8463F12C9755C115EB59EDFB062504176200FDFDA713CCE4BF7F8275BC0E41428F41272201DA9281D472B4CAAF0C7C05E72F34BEACF68FBD4F08FCAFA44759E0B9ED37E262C42B6B201BC9E9766834A7340ED4E5FB6813957236EE6471413342E ss = EC5599389D13B01A0A09A300F44C5ED7C38BC9E1E1D02FD8 count = 26 seed = 7C33CA0E987226C8524DD56C811FA4D1CCF9995B1E4E4DD5B1481974E88CFABFBF6787775C2611CEFB27ED4403EA9B46 pk = 337137C0E36BF4BC3D8C5E4B13C8FDD533F511523D3DC44DE3BCA4AD58F9000C4B4D9E29834BCD528BEF583ACE2B14582F820A225712CE6FF7A1D33A92702720A450348E22989F56D73E21ED0EA5CE21E963433A07831257C1F31860AC568EC5E1831D3D802A8DE861D389F0201AD503C6870FB5BD1E6F90615B511CE1628CA0F4A52A99B948796ECE73626086EF99CEDF1C1C7CC6DCCE45ACB77C95DD96BB0011EAACEEE4CAF305E20260B61A14B3F306FF97F54FE5BA7E9492F843E28A7B0E4A01AAB2B201C9C515FE13D580AFEB32B6B152B647D814F927D7BE6C7286BD6749B26891B1ADE0BC47203B9B0EB3D73066FCBC4FA6E3983A61DF71007C3F9EC5EC690437511C9F90A1B5832DFBB2877A4F2AA7374B3F28B6E74D1F68887CAF50C9FCF374F043907359F5157CDCAFB8083CBC11DF400E6F972F5BF2B4B48D2E7CC45D21F9D614DCF432ACA2DE030FE7DA490FCDD25F2C202E23C5852F41BCD4DE53D787F9E2891836EEBDFAFBE13E02B363C74E7A6309DF6DBC2166C28321F962A2B4D9841576CA4878105B7EF55D3E76B087DDA3A7A5666013B879B41D3E67ADDE7794C277BD055E52DA26514434070CBBA08D02F6E5397FC4677D77C17AF7BF2BC458A2ACDC1556F2C169248A67B077F1881F26302189E3613DD5FEA65F619D22B538C9A20F06C0ECC8B9FEB65422BE4D534E2559267AAA93C6787E54D2591B7E2D0AE32A1A37B42C34C96A93A80FAC2C4340EE19C152130E90C787BF8AB2025561005452BF31A40CFCA066DC6F6728C680160B sk = 013BAB0212D04ECD54B478DAF72748003A25E2CB060BA6CC50BF95C292B8206B9DA0C5DA5F195B80FBB99C2E8B06926074F3F604B3F6195B5A5B9737876BBA72D4C62F5E42E737D461B40043E6C8A800337137C0E36BF4BC3D8C5E4B13C8FDD533F511523D3DC44DE3BCA4AD58F9000C4B4D9E29834BCD528BEF583ACE2B14582F820A225712CE6FF7A1D33A92702720A450348E22989F56D73E21ED0EA5CE21E963433A07831257C1F31860AC568EC5E1831D3D802A8DE861D389F0201AD503C6870FB5BD1E6F90615B511CE1628CA0F4A52A99B948796ECE73626086EF99CEDF1C1C7CC6DCCE45ACB77C95DD96BB0011EAACEEE4CAF305E20260B61A14B3F306FF97F54FE5BA7E9492F843E28A7B0E4A01AAB2B201C9C515FE13D580AFEB32B6B152B647D814F927D7BE6C7286BD6749B26891B1ADE0BC47203B9B0EB3D73066FCBC4FA6E3983A61DF71007C3F9EC5EC690437511C9F90A1B5832DFBB2877A4F2AA7374B3F28B6E74D1F68887CAF50C9FCF374F043907359F5157CDCAFB8083CBC11DF400E6F972F5BF2B4B48D2E7CC45D21F9D614DCF432ACA2DE030FE7DA490FCDD25F2C202E23C5852F41BCD4DE53D787F9E2891836EEBDFAFBE13E02B363C74E7A6309DF6DBC2166C28321F962A2B4D9841576CA4878105B7EF55D3E76B087DDA3A7A5666013B879B41D3E67ADDE7794C277BD055E52DA26514434070CBBA08D02F6E5397FC4677D77C17AF7BF2BC458A2ACDC1556F2C169248A67B077F1881F26302189E3613DD5FEA65F619D22B538C9A20F06C0ECC8B9FEB65422BE4D534E2559267AAA93C6787E54D2591B7E2D0AE32A1A37B42C34C96A93A80FAC2C4340EE19C152130E90C787BF8AB2025561005452BF31A40CFCA066DC6F6728C680160B ct = E54A7BFD8093567D5E24BC22571AF9AFE29EC09EB4A1394564B23A52071BE16AA9B8E10FBEB4F8B2033BCF286767B018E10EB3DF7454EE757018CD3C4545992C5AD6C6F067021B83282FA6C077DFF64E342C046DDF507C7265B45DFFBC2E4CF40D082793A6D836AFBD47A41157CD88ACCF7E99152E96DD93EBD9B0AE7ADB2CADB90CBD542D449A6C40BCA108FB8CA840135F197187F40371D722904A193D7F27385BBDA84CFD9F41A483E40B7D0B9071D2AE0A94288C66F3D4B3E4424504105061FB8E0B451EF079765A54C4AA3661A33A63D206E4AA61F6CB1F082712F8DB0A29490FE9509A51546FD1857755EF339678BBAC4F3A0F5D1563C1D1E75EC054A74A82C3629D726F22C40A874F93C271C0A2E78D0E4A6F1E16260FFD580B8BDE948722E5EF2FBD062D3466B2BFD16BFC70C607F57D6C3B6A19ABD9561AF6175B7923534E78FCA71435DE22CFAD2ED65BA171265171AAE050A32F718BBDFB8817F4E786EFF4C7C72C4FCDB3E39D00D1F07548566BF30CACEB1B331CCB3B9E54FCF609A96A0ECBA77B63A866074453A23745FE1671F57318D9483EF938F462EC47652284F7E4753A0AD69C1250C2C509AE78AFB9B497920FCDE259874DF1026C651D3827417B64126474865A4E5126AF1A10A5412A675D1C3901D311763C97F89FCB6CA9210026787C49783BAC643924C9E5AFEB8772B32D541E511B7229A3446EF944D00EFA31C4FE5C49F243933ADE3E56572596A79E44A62AB1BE96B31CA6CD12994E95513878B626F42B6609FF06F1BEE57773574DDD60A54CAB328B3820961A57A0780CCB82C8A93B30C192F79AF6678FA21293 ss = 8A7A3BEE504F92B64A285D1E5653889DDD97BAD7DED61CA2 count = 27 seed = 54770EA1252EA2857D6635151194F5F520ADEA8A41E409FF498D40C271359858FE2B084D5B96BEE087B8E8F4DD4E00C5 pk = 9E75EDDBDC1890B0A0555414C6DA2BCA213E0B84BF2DE8AF36B8610152F823A1D25FDD1EAE35CCC477CA54A31AFBBB9B5387DBD9791756E528B5A2BAF566EE2230077CB030E48E5C0A8ACE5B94A4ED0E63CCEE1F527CAFD85F3B22B58C3390FD8BB4159FDFE8190428DC140BED44B18BB2E3CBC822408A9EAE7F4997822A25080262B2F8077E388F6AE5D2C4B5881C740F1B7F17045A59CBC836B85837A4FC16A7A72DCC4702639608D13C257AE631EB2AEB2F602CF6982B918AF348569D250ADCB7F18CD1BADF86B5050C88B55D692B4ACFD5B13B22A854871E22EACBFD31DA84413CBC8FE94607CCD71BC43F029046100D1D4F85A6A97F677D9C202CEF32F9B8C3D3FFC19921851A95B4C40BEB90084F25E84781C0E82F79563B0CF3F36DE445D99A374B6CB425FE3D9ACC4979385C8A93CAE21E391A0DCE0598D9D387D28F4CA35EE9D3A8E76BA7FC6E037477A61C92EAEB631D599B72B602C0B3B0AFE732EED5E6D5DA87DAC540A6E4F08DEA8EEA630BE82289FC175B8470DDC8AFB9595E1DA37B3BB1A65583A73448B9554EB8080E4ACE899C6473BAA38353A303F4505BE3A38481656BB2BD72F7165EE6C15FE6D308AF834C8AC69ABC4CFA808E13B0F4BF991C6FA47BA6FFEEDA825F1D125DE762637F4DAA03959D2E0DEE8C4E958E2B3140C1E342737E33CE3D0C2931B26162944ECF5F876C703F23F4E830B40174197BBA7DDA2738597947DF82F7AD4C1BEEFAEA5FD142971A4B4AE9DADA2EE24D6EA745596FA10273BFCCB394592666B18D45BB8E6D sk = CCB073C4B90BE0AD746E26FB093B60C70110BD1DCBCDDB566A8CFFB7B3CAF80E71600A8982C350DF524CDE514431DED7AEC23576530894BCBF0EC0BFEF0BB64F8CCD7F321635F438F55A1BBA934FEC029E75EDDBDC1890B0A0555414C6DA2BCA213E0B84BF2DE8AF36B8610152F823A1D25FDD1EAE35CCC477CA54A31AFBBB9B5387DBD9791756E528B5A2BAF566EE2230077CB030E48E5C0A8ACE5B94A4ED0E63CCEE1F527CAFD85F3B22B58C3390FD8BB4159FDFE8190428DC140BED44B18BB2E3CBC822408A9EAE7F4997822A25080262B2F8077E388F6AE5D2C4B5881C740F1B7F17045A59CBC836B85837A4FC16A7A72DCC4702639608D13C257AE631EB2AEB2F602CF6982B918AF348569D250ADCB7F18CD1BADF86B5050C88B55D692B4ACFD5B13B22A854871E22EACBFD31DA84413CBC8FE94607CCD71BC43F029046100D1D4F85A6A97F677D9C202CEF32F9B8C3D3FFC19921851A95B4C40BEB90084F25E84781C0E82F79563B0CF3F36DE445D99A374B6CB425FE3D9ACC4979385C8A93CAE21E391A0DCE0598D9D387D28F4CA35EE9D3A8E76BA7FC6E037477A61C92EAEB631D599B72B602C0B3B0AFE732EED5E6D5DA87DAC540A6E4F08DEA8EEA630BE82289FC175B8470DDC8AFB9595E1DA37B3BB1A65583A73448B9554EB8080E4ACE899C6473BAA38353A303F4505BE3A38481656BB2BD72F7165EE6C15FE6D308AF834C8AC69ABC4CFA808E13B0F4BF991C6FA47BA6FFEEDA825F1D125DE762637F4DAA03959D2E0DEE8C4E958E2B3140C1E342737E33CE3D0C2931B26162944ECF5F876C703F23F4E830B40174197BBA7DDA2738597947DF82F7AD4C1BEEFAEA5FD142971A4B4AE9DADA2EE24D6EA745596FA10273BFCCB394592666B18D45BB8E6D ct = 9A4211568817FB5C61C4079D9E798E36C44C1FD1960729B8E0F544CB41038857F5B9BF37D4C62064991F4E7ADE7F8E8D2B6864B3B06F2A3BB640ABEE6BF0672B05654046F68172BD13112EC38A8F69AE51D1766E46ECEEF815897F7E9102D90AE5909E5C0343A35A50A4699C55EB5A63F7AC108449F45183EFAB69DAF81B9ED22687DE36867200E80516031097868533DA879504C356640994859E5EF936515467A4685034459AD93D7C425CF1AE3511EE6DF8F4BDCD03D394454F1B0751396BB406B232DC4003E771316B41124232A6DABB6D79A6481B669647DF652B7297BB3CB4539FBCA61BD4793E56AE87EC2D881B3AB3492965DE845C8CBE44D0716E50EA5F30ED53AE68DE707FC0BC31E93A14F6499EBC1D78A534F4563CB17CF17EFBA8F2DD3DA006894B4DC315D43D906D58E217D9BC9890648561C6BBFFB4071F0AD9BF8CD33276CEEFD45A3C30FAE80522F24B646C9EFB3D9C67001C17BEDBFCBD67C842C878C081E306ACE3C2761E7653AB54BB597C317930300CCE34D78ED5ED4A2284947A08C21AD104DC6AE44F30254B7E4D9C9BEAE87E0168D35C5AABD57A8D65384DB80DEE97047850E32BB46C8B7ADCFC7866EB780EC8B0788406213737DB763FB0BD50379E47387E858DC77872980E4DB6C335C2F899541F0F88489CA413D9E097643B2DEF6AD3939BFAF573304C44E1AA48F8B24648248BFB40C6661EDD8D6631D15D329DAB67CAED1059AD31722093164780A237BE405E9A91FACC8538162F0CDA86548DBE51D24ABFD3237940149D69E327DA5ABCC3FCC9F6B67DEA727892B88FFC47E42EB5DB6208F0090FEE73312E ss = BA0D62BB991131EFB1430398AC5C2C2421A2ED8302B0D50F count = 28 seed = CD6CFE94E9C0A1CC4FFDCD2D7876504BE5F50F1D1CA5CF93482943465B268276056F2781F4DE805C138976CA72621387 pk = 6ADAD2D9FDFB71355AC2CF01CB17ABAD58C164EF6D85C1F4F144CBD1E09A112978FC700718BA610D04505E4D51A8135F6CE586C6B89652E047316EDB8402E969587F8F85A05DB95C4D9AD5BA66E3850701F7A61787FEAF992FF18B5A330668977F46403E74CC7524D5206587AC92A748EBEF78A4F91B8C22C410CA656F4DB4B2843CE937A7DD1346DCFAF769D6E911318DF65B41EF73957A8776CC2A8EF0551854AB774C632F6D6E110CD445CECF533024C458172CC2693EA8350C683D14E84CCC8B8BD00B810C2BF6B89FF75165F87DE288A9AAD455C3050FA4D4556F6A9503FDF31F63FAE89032583A6CC6BCD2C19A61CA21AED49BBE9CA82507319241EBDEABB92C6B67C8A22DE3F9720C92A6149BAEF0977CA1B4AEA44462E58B309251A3DCB8C3D60818573AB72ED486D977BD0D18CD9AD5C67ACB10236ECAA3518F66D64AD6C6846FC3840401980FAA09DFBB61E0746CD430E23D9179A0275FD57F4A5536A7FB2B915D4F2DF1E093A7EFE195A7BE074650E30710414588C3247EBCB757B39D47F4A30A99A8E1C000A31A6A7AC0B773894AE58BF25DF5C61A5E6C6EC3C4CEC8ADBDABAE8C9DD14C566481168C673E677E6D5C58D21FDC1730F825600ACAF9304576F9C7F1435E325EDEF36266DE669463EE7522576E64EF3BEA194535D8D80B72D63104899188CAC8F48F2F1E8290B78729616ED0BF59F10969D1431917B465149C04B68140E51B3B120E555C6DBB9A683FD88FE06D939F8AC4E6CA436CFAE078BE1DED5231CD5B89E922D569541BB4991D sk = 2E889F44E28901E9AC7CA6B2FFFCB124C8979401B17064D7E1D51A7E3C3ADBFA0E145E44AAE52CFC609E6F47FD7A6F6AF877190FF52256D0AC5B05B89C3F449F48E7A944F02FA15EAF23A543AFAEFC036ADAD2D9FDFB71355AC2CF01CB17ABAD58C164EF6D85C1F4F144CBD1E09A112978FC700718BA610D04505E4D51A8135F6CE586C6B89652E047316EDB8402E969587F8F85A05DB95C4D9AD5BA66E3850701F7A61787FEAF992FF18B5A330668977F46403E74CC7524D5206587AC92A748EBEF78A4F91B8C22C410CA656F4DB4B2843CE937A7DD1346DCFAF769D6E911318DF65B41EF73957A8776CC2A8EF0551854AB774C632F6D6E110CD445CECF533024C458172CC2693EA8350C683D14E84CCC8B8BD00B810C2BF6B89FF75165F87DE288A9AAD455C3050FA4D4556F6A9503FDF31F63FAE89032583A6CC6BCD2C19A61CA21AED49BBE9CA82507319241EBDEABB92C6B67C8A22DE3F9720C92A6149BAEF0977CA1B4AEA44462E58B309251A3DCB8C3D60818573AB72ED486D977BD0D18CD9AD5C67ACB10236ECAA3518F66D64AD6C6846FC3840401980FAA09DFBB61E0746CD430E23D9179A0275FD57F4A5536A7FB2B915D4F2DF1E093A7EFE195A7BE074650E30710414588C3247EBCB757B39D47F4A30A99A8E1C000A31A6A7AC0B773894AE58BF25DF5C61A5E6C6EC3C4CEC8ADBDABAE8C9DD14C566481168C673E677E6D5C58D21FDC1730F825600ACAF9304576F9C7F1435E325EDEF36266DE669463EE7522576E64EF3BEA194535D8D80B72D63104899188CAC8F48F2F1E8290B78729616ED0BF59F10969D1431917B465149C04B68140E51B3B120E555C6DBB9A683FD88FE06D939F8AC4E6CA436CFAE078BE1DED5231CD5B89E922D569541BB4991D ct = 48F7A877456D6D5AA4BE8CAC3B04C785A53E76C88F5631251581B579CB3A84B50249572B4F5E16408431BAE70B8B921C55F4303CD0AE25534687E042CBE81FB0E59850D8F84811A474BC70714C7BBF9FFF4812C14C3792A1AF1182327F6599A919CADC8CA347A3B4845F3F4A184E3A01A84F39211CD191D17105B97EC7B2641A9489D75995D8F012064B82C8E0BD45698F9CA73A847AF2712FF3BAB21EC8FF0B402EDC0C65C31E51297F454C692589464B3C43C54E258BE0FA7E6356F57B07E38C46CB4AD2E7462E0865E4696672AEC0A75ABF94671FA47C5E48A82CAFDB27CFAE551BE3AD343C6C2F3BD3658BD31117607F2DC70ACA4A35FFA343BC0B574E4392DF279C7873C1F88DE81726B3B17FB3492C76D627182561094355B7EC0A2519AA0FFD959909D025D46DD8540DA282846EBB99A8B783DBF1A00CDA35EE16DCA4C71606CE0525573BC8253BAB77796C3A083201E53B3B83227DAA4E28A078CADF4EBEB49CEFA647A2DA33EA64A9F87DF091B0AB0DB90D67576204338257516CF9688E7ECCD21F9B193A9995E39B8E93F915ACF35E420A95B12992324097D0E89CAE8880015AC3E26C4F186296DF981C8EAF9C0EE0DAC56A17AF1C8D691537389EAA3DA50CC221A46570B3DB8E10E5259DF2821C8C5A5DF04851CCE0AB58FB08D7FFBE168D65229ABD733D0C8CED58273904F870B03D1745FEF7B7FECDC8114017337633BBF61CE4956EBA9E8B9C0A0E275AC12B2E9CC348F08C54B7EF3EA931439D2F81B45BBC2E1147BE1F934AE263A82C6A932AB58D3780D48A04C56BA6393A7CA5ACB2049E671AECB4F5070EE6CE428E233F0E ss = 224834E943F7E7E5237DD6CB38BE151348C83EFEF1B0704B count = 29 seed = 265EB2DE7099E4BD5614E5DE7F0C2A05C78EF3E8E2DD4AE4CB70F3E5E59C8D1D88248303F07DE0C5508652DA66B47222 pk = 7AA7ECE0FE2C84ADE8F7F52D7ED4B6D09D20491A075BBBA39882290CB9C0C9C4F8D4BF397C60F34E5732139CC7A4C5419501F989795AD34505FB4372F845BAA6013008FD4032AE3FBE5EA5C341C0028748E8D8AE698D85EF6F3DC8C69A4E2557EB73B46379548CD51ACB0B3E3152678F4B19FDF9702011364830C437159D3BB738B6F03849D0E2587B825527919F0E274F7F609DC2244F1A967E7E316E602B5ADC1F4401E4C35E6A8730D1AA6B3BF5D8EB7CA15BBDB1060076649C04FED4A2BD73FE31B850B87018340F85BB71A7A5A411121A285E8AB98812CBF8DFBB1B23BB9886D9FED4088B294234E38BE5F488F61EA4E84C97A71C356FE1DFA65768972D93124CC011BA1AC8C2E56A0A5D22EF2CF6290D15AA336B73954297E63076034267B4C5858BB4FC7DF9910C0C4E5A96BB3271E978C964E3A6929AE536F1DEB75AE12073EA81F71C85713D3960138B6B7EBB9B5CE7A5800BD48E56289DFF10E7711E10898FE1736A49CC790F3B6225F2A2AE5E97C2A174815973D19377F3B86F5D7C3207494D91C7BF2B076C7BA3E67B61F5F4F46F7F9354A66DD4FDF4D1E68316FD41B504677865DD7AFA55849D7E87A7B0CBC02030BC19323245B4CF1904D771B5B02CE921120EDEE47A29BEDFCE1B7544F7FA71B0208C668F402DC93B4AE9CA7E9D7069B7E07795CFA2E88D668DD52D091BFB8F6692A99FB305D0EC7AF638FC41E02D0C71399B916DAD94B68874583B0B707435DFEF4B6B7978B887583938BB0B92A0349BDDC388E9CD98BE41FB45224A12163B sk = 174AAA36410566DC15A5E62874218D7ABDDE0B2C0F30D877BB80B1ABD5F5A0A450A7A2354F7E5CEFA6F4A4E9A1C411EB9364506E9E1204A8ACB3CB77FBD2C4ED186396657F35AA3708568C07E71712007AA7ECE0FE2C84ADE8F7F52D7ED4B6D09D20491A075BBBA39882290CB9C0C9C4F8D4BF397C60F34E5732139CC7A4C5419501F989795AD34505FB4372F845BAA6013008FD4032AE3FBE5EA5C341C0028748E8D8AE698D85EF6F3DC8C69A4E2557EB73B46379548CD51ACB0B3E3152678F4B19FDF9702011364830C437159D3BB738B6F03849D0E2587B825527919F0E274F7F609DC2244F1A967E7E316E602B5ADC1F4401E4C35E6A8730D1AA6B3BF5D8EB7CA15BBDB1060076649C04FED4A2BD73FE31B850B87018340F85BB71A7A5A411121A285E8AB98812CBF8DFBB1B23BB9886D9FED4088B294234E38BE5F488F61EA4E84C97A71C356FE1DFA65768972D93124CC011BA1AC8C2E56A0A5D22EF2CF6290D15AA336B73954297E63076034267B4C5858BB4FC7DF9910C0C4E5A96BB3271E978C964E3A6929AE536F1DEB75AE12073EA81F71C85713D3960138B6B7EBB9B5CE7A5800BD48E56289DFF10E7711E10898FE1736A49CC790F3B6225F2A2AE5E97C2A174815973D19377F3B86F5D7C3207494D91C7BF2B076C7BA3E67B61F5F4F46F7F9354A66DD4FDF4D1E68316FD41B504677865DD7AFA55849D7E87A7B0CBC02030BC19323245B4CF1904D771B5B02CE921120EDEE47A29BEDFCE1B7544F7FA71B0208C668F402DC93B4AE9CA7E9D7069B7E07795CFA2E88D668DD52D091BFB8F6692A99FB305D0EC7AF638FC41E02D0C71399B916DAD94B68874583B0B707435DFEF4B6B7978B887583938BB0B92A0349BDDC388E9CD98BE41FB45224A12163B ct = 4A5DBF6788130B275178DAB03F3E35BA8C6F2406EC606471A98805976AE11A978B0420CD76E223DAAB491A958FA09B056ED55765EBB8109CD328119E2DD948649464225028BD4D1D2D9157593C779D5E785BDEE207127808FB232DE6815BA3EEBF6E08C7192132D632709EC5029241C33E5554F2B825992B554C3D6FA312DEC9C6FE90915F1D7471B985D988DF61AF7891553D50419A145ECB6BFC6E38F8AE362C9A95FCEADB6D6210B368623CEFF5CFBB3B331F607A4D673353953E11FCC2385434195D3F2E18AA491F516415CA12AAE8770B4ABC7C480016F73084C7DD4B8B56ECABE929E96F2D2C10D9A94C1AB45FD0353DEAEB2BBCE5F2B163C442D6842ECA28C92947D6A24A6D597BE137DFE6AFF51B12C88466AE6D6E360F7CB39C294F969C79F13006B100B94C98F9C11DF7068D7DE20996782EB55C7D69678717894159E356E670B9732BDED2BD502B3806EF6F962E2591D1F692E1F253BD00BEA085BA1E3CA7CBB7175A28E88CA3633C4EDD5C789C901F6E61002506D7E3D8E6F1D7D8BAD4058648A98425B6FF5FED90BBB60AB06483BD70A2863015E9CC11D3F278CC28CFD117F622C7165A87203EA4D803778F37CCDAD297DEDC400D15FA5475C1B6874F17854FFB10043309489D45432971B9A7A3FF68AF4A8E6D1FEC771467574B51F53107867DC2F0FB806DA06FCBAB93AA8AE530FF29AB43C7CCA5C9C7B428BBB4179193EC4E8FA7526422BAF286CD1FC0652AFEDE92EDE12CF4152DA43C8492875F07DA9171336CB84B713883DF318A5D580B57C1E464F3CF48953C60AB83991E4BCD1F54C44D92EC073702FD39DB1F85AE86 ss = 56DFA28E265939EC9AD4980585429EEACC68DF18C2EAF892 count = 30 seed = 806BBD111F27C2668318387BD0830F65EC21A51AF01985EF48D03D64E1958FF7EE5133A4EBF6DBF36329BCAAF65F40EA pk = E8EA7D979396788910C8F06294BA892191A988FFD792E6C542A159018E100301AB9E568A45C8F475FFC86E41C0C675EB0F59150DCF5F1D510F92CD54CA0BA2AFB8D5E8BEE32600E7FFAB16AC2321C1DCF5F65CA1100D0A88581152B5F76917FFBCDAE3245940222E9C21862E911861D168F162BE507171C643CF4FF26D0DCB17FAFEBF028448A46EC978E4124B4AF7A23A9665F34E0E87ACEDEB11AD2FDC3BC524B19D45212E54A078FFC8C38E4248E9339FEACCE2E8BC22F376F3021288688230181EF0F422780D0563446D9F4193779D6B326BFABAF18E7DC3AD0B974AEF59AAB5242F724C57B88C6671EBC1F33058911ECAC40091E4C7C5146DF0BE0D6A9931400CE41A9BCD3F0AE02B826CE81E7E0B4F23BD81B0E66BCE541EED245AAB2D738F9997450A53A8EA0D32ECDA9D078100F57EFF4F68D496BD012E009D2FC4AF6BCAF782C6395AA3574576829E773B11C9F15A4D7EADB35EFB16945AE85AC7CEC246DE7B5214E744CBB1D5DB3639271FAAFA391EA40BE727831243D9DD3510DEE1AE5F8A491506F5F377DD9125E8D2C679A8A2B1A008F0321A01D9AD7A8660E6BB3B1BEC56895ABE86945DA041AA0683FD645E53AEBB6E4AD56D88A499CA71400458D1781872444CCCB20FFFA156056A6523E1B2C9322C127B1A565282850EEF24287ECBCF6EBA7A38EF942376FBADF40E0261DC6DB5B9A674784FB006329543AA8BAE5AE6098757B4648231AD0C762F3FA5726567F40A91963B8AEB4C0764BB56CC58B5FB9BE48E65C7D6A386298ED3240C626C sk = 351FE4313E2DA7FAC83D509F3103CAF7B4C64A4D458FEFDF636785AC361A1390F072D9B5A99F9C7A0A011E4DC10F6B600D611F40BBA75071E7BEE61D23FD5EDA0FAC43B0E0050838815746054B9C5701E8EA7D979396788910C8F06294BA892191A988FFD792E6C542A159018E100301AB9E568A45C8F475FFC86E41C0C675EB0F59150DCF5F1D510F92CD54CA0BA2AFB8D5E8BEE32600E7FFAB16AC2321C1DCF5F65CA1100D0A88581152B5F76917FFBCDAE3245940222E9C21862E911861D168F162BE507171C643CF4FF26D0DCB17FAFEBF028448A46EC978E4124B4AF7A23A9665F34E0E87ACEDEB11AD2FDC3BC524B19D45212E54A078FFC8C38E4248E9339FEACCE2E8BC22F376F3021288688230181EF0F422780D0563446D9F4193779D6B326BFABAF18E7DC3AD0B974AEF59AAB5242F724C57B88C6671EBC1F33058911ECAC40091E4C7C5146DF0BE0D6A9931400CE41A9BCD3F0AE02B826CE81E7E0B4F23BD81B0E66BCE541EED245AAB2D738F9997450A53A8EA0D32ECDA9D078100F57EFF4F68D496BD012E009D2FC4AF6BCAF782C6395AA3574576829E773B11C9F15A4D7EADB35EFB16945AE85AC7CEC246DE7B5214E744CBB1D5DB3639271FAAFA391EA40BE727831243D9DD3510DEE1AE5F8A491506F5F377DD9125E8D2C679A8A2B1A008F0321A01D9AD7A8660E6BB3B1BEC56895ABE86945DA041AA0683FD645E53AEBB6E4AD56D88A499CA71400458D1781872444CCCB20FFFA156056A6523E1B2C9322C127B1A565282850EEF24287ECBCF6EBA7A38EF942376FBADF40E0261DC6DB5B9A674784FB006329543AA8BAE5AE6098757B4648231AD0C762F3FA5726567F40A91963B8AEB4C0764BB56CC58B5FB9BE48E65C7D6A386298ED3240C626C ct = D17981E2B5D9C56015E26B725D2EF39DC274FF275A237761CEB4853E6706B6820EAA80EC31A515B64E3EA1771C6BCF4751972CADA7D1EB0A679CB2D09F9BB007B3B8D1F8FF770F330CAC68C882B96ADAA35DC427FAB76135D7925050EA2FA1FA026895C844DACA330F8A85A193252D8E6C75F85F7E6A2C2EEAF0D283908AB0D9DC947B192035061C5CAFB3F5F70417D546F7998FB1DA041951A872CE26318B54697BD0C40CF455CAA3C1C744391B0C9F5E198B22B38E1BC22AF9C04BE98723F16F255C368762A0D731159E8D1834D0DB38D8609ABC05A9BDA40A74F0E148C8542E66CFFDE67E7F9B8BC2763892756A569874440D885B175C53C41F74123BDAA37F4E2B22CB6764A313FE314D9DC4BB07F83F3E721FD15F8C1D52E4FF4E2AE5DE258276B1E2CC14591DFA673170EDB3D28F6C03A341D325F5F6A388D334EB879DBBC4F157A69E3E7A33FD7738AD9DF88B27C4AEDABCE90AE66E3896B3285C3140664A13EB1F8D41637585CA54CF35B0A9226C21B69268193DC2E7D6BA89F32D6B392DB56B7C7514EDAC125704419303DA86ACF9356C6D4A9BC7C9A7D7764F3BE8E4BE9B4303F27D67C5C2A41629A0B1BBED2EE9D385ADBE6F42841FBA46EC002C87794564C7A1DC26F94CA6099BCB0D4D3E85B02BF43482B70DCA6985B4304498D5735B72D5CD840436D96426EB5A5186A78D2442E5DB6FDF5D2C6A3F85C3DEC21BC829377C8B7C94CE7C8419505836821C5D30B9940E8D5DC583FC8B1CF82A758D0C708D2B67B2C55B051925FFF2FF1AF96CCC6A0F6EC654FF2E695BE4A1F5B523E683698308527CE25F0D1368A3C5140B6E12FB ss = 92C8E1B28C0C19565ED8481E9C7E3B6CDB1A57668CE12451 count = 31 seed = AD540A9CE816D6FB1661E5483C44F6FDD00C9E7BD1A8CEDA4B4C4D3697D4F78ED0A56954996CCB7DA96ECB8F5CB15809 pk = BB329BC12EB49CAE2F2D4D8106A60100D17E8D0F452387B8F9385380CFD0744EA30A8FEDDC5F0A9C38A79935FF33EF7ECA52260FAEA4619BCDE768CC476FA5E7B85F0AB187E2B2ACBEBA02AF3A0A8C5D74C60EF9E9682A2DF21F9345A927FCCD2A0B2C116A0C140D9B44EDAC1BAA4306F668E6DD657235C02059E380C206758992F354A652BDCB8EA773C76A575C7A8F4D2143FAB64A33E8914F5825CC06B0FABCA71F6CCACA2DD9B5A48F78E15E9E9E7ED4CC3129119243C47706287DD52305583E4A18792583B900F720A2E99853D2FDC88B51A5308DAF88A62079E95DC0B6D1502A340CE4DD95D8AA507636E01007D49821557E6EC3B2DA138D127D6A25DC519B1AEBF73516555340372EC46618C1BC422E97612F1C944B222CB74DF40A6A1BB3A8B2141241FA4EE56EB016FDC7641D3A3C03FC9222D82B7A2B3E58E901C9BC0B6691CD50A20ED25A8FB7A3938CC2C2AAA7D844F7647F6B4024E9917B9ECCEA7E223A9639E0A952AF99763916CF70DC913AEDB520402EEF7E8C4C36B761F003280ED2019391DB8B051FB02D2A275685E5BB4273F274C406C2F323A9B6B2A2967DCFA33866BFCFBE7971FB2592B604086AA95D70681C57F2C92B7ABAD33152DD8F4390E595FCCA6AD2224B70EE9ED6300ED25ECC3B9F4C8C57B93F520B8FAC56ECAD4F855B2D220D8E2CE761DEAE3DFA11975664B6F4E38FC86A1A4ED395B81B20A9A8DBB01A369825519414968468E2271AFFD243F63E26F8981FD13281F9841FB83CE4C6F3FF59AA629CED1C49A383ADBF5A sk = 9BC5315580207C6C16DCF3A30C48DAF278DE12E8C27DF6733E62F799068AD23D5A4D0A8A41C4F666854E9B13673071CEB2FD61DEF9A850C211E7C50071B1DDAD03868EAFC78673F68DF9B1128BCCB600BB329BC12EB49CAE2F2D4D8106A60100D17E8D0F452387B8F9385380CFD0744EA30A8FEDDC5F0A9C38A79935FF33EF7ECA52260FAEA4619BCDE768CC476FA5E7B85F0AB187E2B2ACBEBA02AF3A0A8C5D74C60EF9E9682A2DF21F9345A927FCCD2A0B2C116A0C140D9B44EDAC1BAA4306F668E6DD657235C02059E380C206758992F354A652BDCB8EA773C76A575C7A8F4D2143FAB64A33E8914F5825CC06B0FABCA71F6CCACA2DD9B5A48F78E15E9E9E7ED4CC3129119243C47706287DD52305583E4A18792583B900F720A2E99853D2FDC88B51A5308DAF88A62079E95DC0B6D1502A340CE4DD95D8AA507636E01007D49821557E6EC3B2DA138D127D6A25DC519B1AEBF73516555340372EC46618C1BC422E97612F1C944B222CB74DF40A6A1BB3A8B2141241FA4EE56EB016FDC7641D3A3C03FC9222D82B7A2B3E58E901C9BC0B6691CD50A20ED25A8FB7A3938CC2C2AAA7D844F7647F6B4024E9917B9ECCEA7E223A9639E0A952AF99763916CF70DC913AEDB520402EEF7E8C4C36B761F003280ED2019391DB8B051FB02D2A275685E5BB4273F274C406C2F323A9B6B2A2967DCFA33866BFCFBE7971FB2592B604086AA95D70681C57F2C92B7ABAD33152DD8F4390E595FCCA6AD2224B70EE9ED6300ED25ECC3B9F4C8C57B93F520B8FAC56ECAD4F855B2D220D8E2CE761DEAE3DFA11975664B6F4E38FC86A1A4ED395B81B20A9A8DBB01A369825519414968468E2271AFFD243F63E26F8981FD13281F9841FB83CE4C6F3FF59AA629CED1C49A383ADBF5A ct = 6C742DD1A3651F60B4546A55A87592403F889CEA3FA62AEA8F5CEAA6D5781AA0EA5DCF97F77A8728B50980CFF9BEC8CCBBF1A2A87B10138055F3AC961C560B16A5D20BFF2852504BD33597DA83B3E4B2B1FABA4F087CF2764DE1933CF0315185D896D3E8D09022A98EE09E18C570BBF541EA0D5E266AA9ABAADC29EB9ED632AB2E9871C148675D9305CCD3FAB16FEA45E291E4EE21159A72D7AC2DF02A06D8A47A687636369764A6BEBCF893503E1426BDBD77D6BA5152AE91C90B28030186335742208B87927889E6BFC41D794B09A6ACA5047AF2F1293BB5FEFA929BA8352D28C04B21DC0AB1CED4FDFC31158536D99920FB77B7D68F5AA35462E9795E9872348C9ABC1A239CF60C8484A24679A0D41DD6D6DA6437BF456B2ED25A781CEE0E86834855167CA1172B45D685F485D689942479254D1E4DC4FA01B7D4E1B311A4A27AEC6F33B76A302AB4BC9F5E45E0CEA4E3C08F70756EDE9685F48291948663058AC82D0010C3612058F660A1A46B7922B2B6D712551245290659BF115CA49436AC9A7146E231DC4526A266A9CCBF5C90E01332EC971AC9F73918FC645C4BC8DDAA48EDFF8046AE23B5BEB717FB2EA0B4ECA95932A966B5A283FB6A0EDB28A5112DFBAF37426E53AB1F283986E5813D73A4118B215C840C4183A461F370D7247DC63D664BB0414D669ADCF7C76F16CE632751AC35D7F2B2D14072BF64D0A847110B676FBF64AFF43C7FDA2C98A4EA1F90B2157FF85B3CA3123638AFCAA257AA20015FE2596C775EE98BB8F69AA4F5C1C97B37567E7876395C1B6872B5B45B54744161D644E41F3BA6AB7C77F6B92D1806C0BE18 ss = 4E17498F8015110E640AFADF74959238FF1345AB26101DFF count = 32 seed = 288A5F2684D862A86D2790AFDDDDBAC6FDA934EE7D2E6DA1508BB550838609E8107312B28E00A6C01706374CCD3AEFA7 pk = DB64F4424CB9E13D49C7FDF53C98EEF30A85C31BEFF21089D5B7C8EA3AFB51CBC258C0C4B11C7EB9A4CA72148B530D5BD4520F9A9D4616E0D20F57EE516E7D9524BE8110A9BB78558520A35C7C7DE33D48F280262ED512C5BC4849B447070EAB2D5A259174ECB81A29A3CD174583ECDCD0846E3EF6DD6D849B9FA14D88D775DE98CA121F2EFC8FB0E75C64B6BF1F039B05331C38F9DFBCE467F0BA81EEA8004CC30BEFAD6E32E3309A9353FBA9085EBBD5770B8ED9BB9075011B1C6B0ED149AC726F78129F5EB7CB9FC9788A4F6C5423E9745B6B2E5DBE1E813E826A6540319B7D8AC5BD8DB14A2F55F418B3829389F1733C75981D8E1E0389E97B09FFF80BAE84D0C655722304ACA3D5282211EBEBE45EDCC82104593632F3294B6564EB73D5035B912C5080BE5EE40E753515C677B7DD9828D14A3064DF40A2A50A6F2E4A24C94871E9ECA4D050B394C89F7B192ACB8EDE0A1239C37CB60F2805E299AECB7BB8F7B5BFF383D0318DDB896CFE2C4F058913B26DAFD3F24A58F053302C800CCBCC6F4D301A2C22A56805293141AF738EB3CB022A5D764D27472F9BE55E6EDD4A829825815E5D99687C966E4E5AC1E3A738C4DCD432E74F9A47714294ED088C2112BA77CA49A97BDCF1A44379FE7B45350EF5EDA0633B8F84152025509A718639E588FFCD74467F0DB4BC3A6739697CD0315BA83E7150F2CDE521A276B652BCFE99697217DB2EB98FC8E8E138F7F2C0430DC798E4BCD6FFB8C0F50F3071A64D381D40D84EAE3BA9E4AC08ADA0C29B84B8A559EF5A sk = D8B907B34D152FF8603B73051F772DAA71EB902C47B7E2F070508269D757E02E36B817736CBC5F7B1DD6EEF5FE6332FB1A598F3871E5470D440FD2EA631DA28A947AF66FBDDFF91068DB66AAC4154000DB64F4424CB9E13D49C7FDF53C98EEF30A85C31BEFF21089D5B7C8EA3AFB51CBC258C0C4B11C7EB9A4CA72148B530D5BD4520F9A9D4616E0D20F57EE516E7D9524BE8110A9BB78558520A35C7C7DE33D48F280262ED512C5BC4849B447070EAB2D5A259174ECB81A29A3CD174583ECDCD0846E3EF6DD6D849B9FA14D88D775DE98CA121F2EFC8FB0E75C64B6BF1F039B05331C38F9DFBCE467F0BA81EEA8004CC30BEFAD6E32E3309A9353FBA9085EBBD5770B8ED9BB9075011B1C6B0ED149AC726F78129F5EB7CB9FC9788A4F6C5423E9745B6B2E5DBE1E813E826A6540319B7D8AC5BD8DB14A2F55F418B3829389F1733C75981D8E1E0389E97B09FFF80BAE84D0C655722304ACA3D5282211EBEBE45EDCC82104593632F3294B6564EB73D5035B912C5080BE5EE40E753515C677B7DD9828D14A3064DF40A2A50A6F2E4A24C94871E9ECA4D050B394C89F7B192ACB8EDE0A1239C37CB60F2805E299AECB7BB8F7B5BFF383D0318DDB896CFE2C4F058913B26DAFD3F24A58F053302C800CCBCC6F4D301A2C22A56805293141AF738EB3CB022A5D764D27472F9BE55E6EDD4A829825815E5D99687C966E4E5AC1E3A738C4DCD432E74F9A47714294ED088C2112BA77CA49A97BDCF1A44379FE7B45350EF5EDA0633B8F84152025509A718639E588FFCD74467F0DB4BC3A6739697CD0315BA83E7150F2CDE521A276B652BCFE99697217DB2EB98FC8E8E138F7F2C0430DC798E4BCD6FFB8C0F50F3071A64D381D40D84EAE3BA9E4AC08ADA0C29B84B8A559EF5A ct = 495135BE176B606A2BC81D026C5BB79560902AA7286ECEBB9EBDEAE456741173BB718B1B85277298B765AF685DEE9A5E759841D1B9E6E56A45B6027B505724C8DF701F9C9E16ECC6E41655B3ED98C53377CD71EF941392931B5FC5D7E22577B6539B5ACDEDE43FA35E8DFAD9BD28782F70DEFDCE2E58C899D234C0A69F0607BD59676079A2DE1FD79122FE307285C8DF1D84DCFF92C0C75CB95991DEEEDEB9231D7914E2A1227CBE3AF70DB5E89E208C7F32516F06C14A67EB04705CE160061AFA192672D1BD59B4152D5A8A854AB501A9FBBD55FD9D199ED55061EEF4622EBBF783685FD4BCCAAC39E8CCBB90A9168C54B2F447ACE701765F45C7E2960674FCAD26EF12102B5F9D8AC57F1403C5BBBAA67B8D1ED6C7A5BE22479AD14BF7360AC3837799BBCBDA7785FC4EDC0C67EFE30EC7E636F5A3AB2B15EB050CE4CB81C886FFACACBEE09F926915A9A80D403754F5B4627EC6943CB786A21EA86588D199B528C87BEB384490979E4DE4E9802C869EBB5DDF7ADE683C76629A19AE72F8B8C13D246D41F9D49FAB97DD6FF9F7EBA9AFA86EB3D534B7F415FB639512B6F32E30B073C6AD107E7D6617CBA1FFC7143E2B6C6BC501DBF0706DCA44ACC7D86BD1BA37EC34A9CB3DBDD45C6EF817C8EFE8862E075A8D1575EF55758B6B4707BD9DE9AE929652EB1C1AF3EF3ACF56930F31CB8EA08C075F51A621DE806F54A26A70AD0FCD93ACA807D5C9373126B6CFC548DA1D1F67C3EE154CDA82F64A780604ADC7AA2A53813B73F54F1A9F995E5D149574B1BE4EDF837DBFDDE7FAD612D9BBA91976BD8D124F16ACADD8AA6F4CCF0E652BBE5305 ss = 0741F7257C3097E2C0095F0FF18D9ED80F50B9BDCE406494 count = 33 seed = 4635DC5BB92EF98CDB6220DF0DD717C7F8158375EAA2B78FC3F0B58E9C9653E92684CAD3461D9158A481DA3D14694C44 pk = E42E57801904C54DA604276410E59336E8E2BBD8C73D736E9DC332545C3954115648E9E3ED97452653098F93D02E2DA0B347662CFB06C82C0EB8D501897488F1BD5785B6D5CF5F0B79FD1438BD8BCD8D33D962F292DDE285953209E98241551324D44241EA1CE22EEE09DF8EE177D75EDF478A79E905ED5E1CB67EA341302EB2003EE0A91F77C45884A74377F95BF88A3E30A159695E1D3B5BB319C803D935EE6EEBBBA06BBCD7DA32D06627B5D80F42152B856B12952E86066D9C5C039B6B6BCA6FFA39C769BE98459D73A4DFAAAF31CF1B8076A7822B5E30926C6D0E5211B66B3D518C9823C25C2910461A44F0BD3CAA31EA45E8DCBD516A30DAE550655FFF7C9E258426D91C5574AF2A6F1E0898EF81C0D9EC0239DA627E552837AC03AA6CE0465412FD357EFCD318EF1AABC8359F2510258FC24EEAF3E0A5EE7BF133D7074E9B59D0D4692B823D2E251A13014846FD9AB5FBC9BF80F3EDC705D75E58F406978432E2A85F54074DDA18E20244B72232E7091E5E24D63E8DCB7E22F66D2D50665864780AAC009BD0CF198A04EC7CA1C869CEFC661E04644C7B2F853FABD45CB46663804A04A294478502E95C9D22A703CF6FC4FD034EDF0AF1693E86C041EE0FDF3DDC34E44925554FC0A1DB1644A53C08EF63D14EFA902DF0E2FD65A013863A62D3DA99B833352A449355E017B39D2255D16709FC5FBFD82F5EF2FFB12DA9FCD6BF627CD5D9582A28CE045A0AAA37FA558645CBABFF172CFD98C9A5A1A9DA5891E8B5199C8CEE37C73A88D7F916FB374F156E sk = 684A29E4E5480A5F2533E1526B5FAC8CDF5927F3D85087C71F928C59690EB56575D12195EC32A8686D0600E45D4A7F54219B0D7A3826D193A51B9156ECF2EDD630128521D62DBFDF5BC133D4EFF12A01E42E57801904C54DA604276410E59336E8E2BBD8C73D736E9DC332545C3954115648E9E3ED97452653098F93D02E2DA0B347662CFB06C82C0EB8D501897488F1BD5785B6D5CF5F0B79FD1438BD8BCD8D33D962F292DDE285953209E98241551324D44241EA1CE22EEE09DF8EE177D75EDF478A79E905ED5E1CB67EA341302EB2003EE0A91F77C45884A74377F95BF88A3E30A159695E1D3B5BB319C803D935EE6EEBBBA06BBCD7DA32D06627B5D80F42152B856B12952E86066D9C5C039B6B6BCA6FFA39C769BE98459D73A4DFAAAF31CF1B8076A7822B5E30926C6D0E5211B66B3D518C9823C25C2910461A44F0BD3CAA31EA45E8DCBD516A30DAE550655FFF7C9E258426D91C5574AF2A6F1E0898EF81C0D9EC0239DA627E552837AC03AA6CE0465412FD357EFCD318EF1AABC8359F2510258FC24EEAF3E0A5EE7BF133D7074E9B59D0D4692B823D2E251A13014846FD9AB5FBC9BF80F3EDC705D75E58F406978432E2A85F54074DDA18E20244B72232E7091E5E24D63E8DCB7E22F66D2D50665864780AAC009BD0CF198A04EC7CA1C869CEFC661E04644C7B2F853FABD45CB46663804A04A294478502E95C9D22A703CF6FC4FD034EDF0AF1693E86C041EE0FDF3DDC34E44925554FC0A1DB1644A53C08EF63D14EFA902DF0E2FD65A013863A62D3DA99B833352A449355E017B39D2255D16709FC5FBFD82F5EF2FFB12DA9FCD6BF627CD5D9582A28CE045A0AAA37FA558645CBABFF172CFD98C9A5A1A9DA5891E8B5199C8CEE37C73A88D7F916FB374F156E ct = AD4D8C02D800D6709F2D14B7C0898191899AEB5B19A98C09CE866D70EF9CE5E7B431CABB16B5626A6D6DF8B26F3BF8BB2F02AB1F7FFF933A4F2A3560AEC9FA5B87786E9896CDD1CBFBF351DFCD1F0921D6292CE739434A307A2708EC5E3D2674B26B6D584579DF465F11933BF93E05C22C548AAA8471173D8F11545E11BC56804B97E668EA443BD588305BA491891F6B104D0D60F332D8ACA5BF09E2F21721FAB2C6DA1592D5164885069A626FAA0BCB9101C1D6E3942C5ADD09836322FDDF4800BC985DDB85EB504E15D8543B2DCAC5482AF804EC1E88853648F91A3CB8A781C04185D8E8E4894907B4EDA8751765454ECB1DE2627004E40C13A60798E507D1F6F6CEC60E974305CD3C32D8D26D37730C954E2425982E3F3B151269E535DB0A76F975C4FBF7E0D9836DD4705053FB94E455AD93B974E0008E3FEAA0272C6EA26F604CEE26CD837002825385815AD525524070618A78A57D618D5ED4332D0838EC2661CECC189804878577053CD998B076BA562F41600017EE8089193D058F3960ECDB1867C3CCB4ED6144B81E6CAD72CDB8FEF60FC4937873988913984FAAB47777868DAC2E21C2C2720AC47ADDD480E019CBA196B3359285133EE10A28C4097C8EA356892D2873C53ECEFE5ABC38CCDE198ADDE01E5D1323B199F81633BE6A52137B8CF30E2F77FD0B2469C3EC686DF5DB61CC71C7667D2F63B11A46514F54A2D7D508FB936964613052D8DC69614AA9266F1D3DF00BFCA633D63D3B0CDA41FF9544392844D5DD62971FCD3CF3CB583C22EC3A8BD2D5076B81CEDCF2FC89B623D9B0382537C1811F4E329B2A32DE86E103C1E5 ss = 5C237ACE434B359DC6C949369D0E74A213CF1074E164CFFD count = 34 seed = 5DA2C51B4ACF488C8BDED5E985CC4702E4A7BCB248B5AC18AABA529F7F9CBF30EFA776E99F76D5C1686E94F50FB57DAE pk = 7C4DDF275A829D1178A0270C4AB27C18D54C3FDEFA783E73330A03606C8D3E5EF2B85CECEC47A00C0173DE615D2137BF3C6E0969EDA345EFCC0F7E18D1B30B7772DC1E650F0E95C3C15B20C42DB1DF61EC6E3C9309F6460B61C6E104BC63167FBA4CE69B33B361275A86E3622F49227D7D452A60A1F383DA7FF888BF412D5F1E6A30E14FA3FC01E195F79F1C15F9E629894ED8BB0878EE74DD3D140EE25EEFB6295B89BE11B578B685438F87BA94A20AEBBB8120C00AC4356A9E1E261003125605E9F43DEA266D2DF206FF38CE22B99C36F08DA13E6ED8F3298EC17C274AB6643634E03CCC303C73FBAD1F94BAE9C5A602597C13DA4FC586E7C6B0957B3082268C1DACEA7F8DBDD3704BC0FB95361F49E263E9917F4EF1FABB0CE61EE4F92B2DAE05C61EC2D6C3D6F5A1C37C88887F39861E0C548738820973BFE3F54DA5FEA435A7D1946A998980C6033D4B44CA0B6801924FD709BC31F75612BB748D6A8E09A1219622F7A7F92F15D8D09D4CC38A9958507439D1807C3FB6E3F1A95208733BA249BE71C588A47019C04E5FCDD5C1AB90EE80EF948589ABDD889667D09D0317AFF05C1DA988288B3BCC8437331F4B4A12BA45A479C5606B1791FBE1D44A0CBBAAE1D0213B03191A89B1B8997B1FECAD20743B1ED0468E00B03E446E186BEA1E8776C63FE954AE5564CDEA0AE31D7295E6E0EF2777DA68583DBDB1F89AB6D524C8F572EFD356A354BD747B004BC14B60809C9F82A96C1C5E161EB7192D7E30B5B303EDC891B3FF2CD848E5B441600D101767F06D sk = D76B3573F596EB286AB5231FEEC7499686B13021BE36CB126C7EBEB9D7030DAF248C0A21EA0BB6D6F56F12300E8584D8E9A34E0E6F52227281151AE4C305FB8FB2894654A15EBA3520C53320159D1C037C4DDF275A829D1178A0270C4AB27C18D54C3FDEFA783E73330A03606C8D3E5EF2B85CECEC47A00C0173DE615D2137BF3C6E0969EDA345EFCC0F7E18D1B30B7772DC1E650F0E95C3C15B20C42DB1DF61EC6E3C9309F6460B61C6E104BC63167FBA4CE69B33B361275A86E3622F49227D7D452A60A1F383DA7FF888BF412D5F1E6A30E14FA3FC01E195F79F1C15F9E629894ED8BB0878EE74DD3D140EE25EEFB6295B89BE11B578B685438F87BA94A20AEBBB8120C00AC4356A9E1E261003125605E9F43DEA266D2DF206FF38CE22B99C36F08DA13E6ED8F3298EC17C274AB6643634E03CCC303C73FBAD1F94BAE9C5A602597C13DA4FC586E7C6B0957B3082268C1DACEA7F8DBDD3704BC0FB95361F49E263E9917F4EF1FABB0CE61EE4F92B2DAE05C61EC2D6C3D6F5A1C37C88887F39861E0C548738820973BFE3F54DA5FEA435A7D1946A998980C6033D4B44CA0B6801924FD709BC31F75612BB748D6A8E09A1219622F7A7F92F15D8D09D4CC38A9958507439D1807C3FB6E3F1A95208733BA249BE71C588A47019C04E5FCDD5C1AB90EE80EF948589ABDD889667D09D0317AFF05C1DA988288B3BCC8437331F4B4A12BA45A479C5606B1791FBE1D44A0CBBAAE1D0213B03191A89B1B8997B1FECAD20743B1ED0468E00B03E446E186BEA1E8776C63FE954AE5564CDEA0AE31D7295E6E0EF2777DA68583DBDB1F89AB6D524C8F572EFD356A354BD747B004BC14B60809C9F82A96C1C5E161EB7192D7E30B5B303EDC891B3FF2CD848E5B441600D101767F06D ct = 3270BE61CF9F41990F3C535B6F0C699C34129C05079391CFEC721DCD3984CC559B6380BFFD6304EC438957321858A2DE91EAA0499B331D69CAD25E680C4DD57FB7847B44ACECBF6541CA717662344FF79A2A5B25551C07385A4FD823A002C1322349A42B2A54494C346DD88010764D82B2CF8975349C1B1DA9A1FAE3FFD8FF90C1CD4DBAD3B5D05012052DCEE6D49538B8851F3091F58A1EF8118928047FB3B6AF75A56B333631FA6816354F3CDE435F87E4B49ED8EF35D5DF84CF66E585DAA12CC891EF5B61677794055AE269F76609024018417BED94B5C729D580B653115104E277EFB1B810A76A1CB5CD54CD3D0B50F4E255DCD4642A3B8A4EBD4C6222C7A2466C2C449B7CDA282AD4B534BDF288E8A0EF4343DF82373E586CF0B341B6C4B11565132A88FFA781E99C416AC79B7C176E820255535C2B4A4E12D00473C5A117947BF1A50676CADE9B585F2F8B581071954316F6CDF788184E096179AF9E2AA9343C95C04AB8FBBF8CBB1FA604390697C57CB04553B521E981DFF169B840A3BC4FA2145607CCF39706695D677D331B6F5567746B86BECC2BA2854A1E94137D9610A43A1742653D45D40757685F05E9FC32549FF1B3B186D03756F47DD6AFC2D857893F5FFF0C4EC4F4AE54E2333A635151750C9911E9C32DC8DBBEB2ABACE04CF2AD383A2600A7B33B338A9E32AC9D55062ED26BF408AF3BF3AC6C570B98DC7DFF94669F5CEED4D22015E7EE30F3D523ACECAC7C9FA3EB6AB658E7DB74BB46BE792F234FC653F6572DC46871A0864A3B9B9934AA5025CF65CA72FDBC5A2B169473A111BAFF2A6B4478B36CFEDE8D531BD582B7 ss = 28ED30C12048410BB96664F82A5C3014B15949DBB5757FE9 count = 35 seed = 4D2239E84B052109A78DBAB6D80C51A86D38248105970476B74A0B78B9CFAB6283E30D5A406FAE1C7F54F8BAE1110EE4 pk = B3A4EE771F7BC17184BFA5314674D83D597AD5AEE63BBBDD9A0F202DE4BB482323087A45A44F52CCFB3C9352AF3E2DCABDE6C1C6FD76691B8D3505E44484B93263F087FF6872E8EDBDBF7A67344B84B6BD8CC8EC6622367D849A0C27111A1CAE25FCD10BE225DCF0385E70D17A13A212556B5427EAFADBEEE33A3EA90FCC7D102101F10D469636ABC5F7653E56530A142853FA5FD82291DE6A439A603076B11D67337B39152E638ABA5D22BE3DFBF5B407E91902057A9B1188B22F23575C51881620AA67886DAC2B9501F7FB87F5159344FD24B7629DA775DCFCCF7328813A86F1D7FC2572EBD96B1742F5998825EA72F351B79E1B3D50BE53702889DCC29848F778CFC63428235548021A6323F224655E0D9F9F2D572849AA69FB2CBFCFEE6EA5691DE3F694C23209D4D3F040BC7B5699AA7715AE1C7076087D1A50B9E7842CAA0452CCACB31815F47A631582B468AE35877F28201F2041473841334818D12C7B5DDB0A26F1EC21870292E9ADC7385697B71E66B38F53184357E0712BB9E081E4C2C6C96F4E6FF568430949277A518EF5E839E6EA0CC79D544757C7ED8348C0044CC48957013B3F6E4963D33FB6164C10E440AAF9A617B916275FCC695DB71516E6DBFE6A8392F93F7D944AFA1F3F47C7C7579D096DB356E30C8808872B35A037DC4E35851C12B81D8EFF18B920BDE8C4C014850B1B3C7A79A196AA52BAE9DBF8D9C031837856DCBCD3AB9C9B4656A51756610F7D383C8AF5A5C6B5B9E4283D1FD1DD4C0F282E6B8CC555DC4AC4CD1BE3534625 sk = B87439FDE81C9E39EEBE7CF741C685785532C1DD23E8EF868B9CE7A541010F3D1646460817A0FCE5836BDFE124A7448E7ADF7B8ECC2652AC6D280E986682DF7100815AA831A61B6869EE6E7B2CA63702B3A4EE771F7BC17184BFA5314674D83D597AD5AEE63BBBDD9A0F202DE4BB482323087A45A44F52CCFB3C9352AF3E2DCABDE6C1C6FD76691B8D3505E44484B93263F087FF6872E8EDBDBF7A67344B84B6BD8CC8EC6622367D849A0C27111A1CAE25FCD10BE225DCF0385E70D17A13A212556B5427EAFADBEEE33A3EA90FCC7D102101F10D469636ABC5F7653E56530A142853FA5FD82291DE6A439A603076B11D67337B39152E638ABA5D22BE3DFBF5B407E91902057A9B1188B22F23575C51881620AA67886DAC2B9501F7FB87F5159344FD24B7629DA775DCFCCF7328813A86F1D7FC2572EBD96B1742F5998825EA72F351B79E1B3D50BE53702889DCC29848F778CFC63428235548021A6323F224655E0D9F9F2D572849AA69FB2CBFCFEE6EA5691DE3F694C23209D4D3F040BC7B5699AA7715AE1C7076087D1A50B9E7842CAA0452CCACB31815F47A631582B468AE35877F28201F2041473841334818D12C7B5DDB0A26F1EC21870292E9ADC7385697B71E66B38F53184357E0712BB9E081E4C2C6C96F4E6FF568430949277A518EF5E839E6EA0CC79D544757C7ED8348C0044CC48957013B3F6E4963D33FB6164C10E440AAF9A617B916275FCC695DB71516E6DBFE6A8392F93F7D944AFA1F3F47C7C7579D096DB356E30C8808872B35A037DC4E35851C12B81D8EFF18B920BDE8C4C014850B1B3C7A79A196AA52BAE9DBF8D9C031837856DCBCD3AB9C9B4656A51756610F7D383C8AF5A5C6B5B9E4283D1FD1DD4C0F282E6B8CC555DC4AC4CD1BE3534625 ct = FBABD3EF3EDA6C64722BEB37FB80CDDCF6AE125AB903CDB21B2D060EAE96DB887C5313853B3ED94F4C967759456F7D5B83A4D2E4394FC54EBE89BB35C9B052B882FDE9FD9D4D59DC9D7CB1450067987B4817017B233EFB8AAE92D2BF53660454449D29480D87CCDF8F6E57A24E4F74F2EA932EC75D864631632F32AA83139310A1566403644DDE189105C7249E546E9C66DA3E5A24DCBDF57CA8A587DDBB3F24D6B0675FF0B5B05A0B1DE288D5CE81782FC860F973C033F9E528451D66762FF60223BA8CC194B1F0615FD72BCB8FDE0FD847919FA2D33B746205E29443BFA4319718B54CE91671371BE5F0A16347CA844CDB3758B9C03A93B4E22D790AC34DDB17E8F7E9513C9D8C1D0D185C90C89A90E6D4547225DAA01B6D58CB2C9355D17F8D8E57E1CBEF0CFC9832B200D7230BCDDFBE94BA2B970A837FA131ABBD395EC1962B54B9BF6A10837001D5C394354B28EDAAC33EA17A1F0F5C44BF3D11F0DE62123D4B133C5BB2F4584C8EADA27FACCB90C18A76E3105D43AA9854843AC6804E184500BDD5A44C1E290D60A00FD7347409A2AEBC65CF99E6C8FD9320C96CFA06BABE90780D854CEC1AA5A8175F83E3828353298193384A15FB1CD8AF01354CEE1B20306FF581DE7FC4142D68A50EB2C9D093582EC8040528028C13717EB27B1217E586EB7A126491CA2959F7406620735BA155BAF180FC35B922A8C802536FC9BC15492AF3E6F63B3F2A18F92B6E14FD71A8540E80679AF4E79F9A4BBA43900AD6A7B6F26A611FA9F5FBE0AC4DA4F660341F9643DD67ECFF0ABC77E056DEB87BA5F5DFCE483A8BE7C9C55799986C52B0A9D3F96E ss = D423CC1CF194DF75EA0102E828869B9D14253852E6698AAF count = 36 seed = EE762F5C9021C36446706A88EF16312F4A12C725CD7AFFF1484337C91EDA8E89F7007F3705747D29907B3FB7500E5074 pk = DD1A4669378BF5DCC795DC3E1FB33FF1EF03E2D7ED3399760EBB1B7DFA9FCD0B93D67B4B054181FB70185C17C0F6DE38A1D95B8505AA28C42D1BFC2912BB4969B74622A8A5D22A891A290D8C6F19C9529DA73AB188DCB70FD1E725B9AE4210B4786DE75B296F56020229E4828C3D603865004DC3D0E0F345AD2D65AB9B18061B5B5F0E71E6BEE8239C65B34C7D56FC90649A7328B7A6EA827ECDD01CEE079CBE633CCADAEEEC3837A584EB084746331E38D5CFA20D139BAAF42E2C435820B6BC15FFD49C5351DF4CC95D6A54797C70B12D651AC1AD454AC5A5F1C04ED285F5AA9F1FD4838B6480604BD823C49B62115F7EE33EAB2004915C5D28F8F92D0E2D1F6CEDA60AAC4904F4E96716AF0B61FC617CE8BEE84D297E658A5850020925025939F40A7B688DE5A0FE63E7C8E325A00BBD453826CB7341CBA613403F26B14A2D1EE7F572567E5AA91068FE6B25FE75A39B7E9CBA5DC6083D7816E3BC7D920B94B9BE94F57D753A57A50D0D0D90F2BCF31A6924D76E6CBD206F8A4A5453D8979AEE4AD755CE6FCD68DA8A57A603AE91B61BF9467B57B1C1C44EC1D209990D5D6CCE10743EA05216301D9AFF620370C4B73F53958FC50008CD0321BFBD456C413346EF968EF1512087DB70AC248F6E3BE2203C05D24C2EC5CCDB6984C152648FBF52967866BBCD18B66EADA25B53DF9EA7AB629B1F2A737779BA1DF7876D8B58F4293D39C35E0F308F6DA45EE1BB9F7C8F086321FE713A7A1FCF136291D8670844417CE71E7A355BBB81AFB659C8E0BA7E1DA8510C sk = 056661B38038DA4FDD7426F32A81576C73ED84843B305168A374F934E27A4E1B79238A80DCFD7C992D84B2DFFA67493E669243D4FA38C46B090BDF86BC548411A77127B247925850220B0BE970AA3500DD1A4669378BF5DCC795DC3E1FB33FF1EF03E2D7ED3399760EBB1B7DFA9FCD0B93D67B4B054181FB70185C17C0F6DE38A1D95B8505AA28C42D1BFC2912BB4969B74622A8A5D22A891A290D8C6F19C9529DA73AB188DCB70FD1E725B9AE4210B4786DE75B296F56020229E4828C3D603865004DC3D0E0F345AD2D65AB9B18061B5B5F0E71E6BEE8239C65B34C7D56FC90649A7328B7A6EA827ECDD01CEE079CBE633CCADAEEEC3837A584EB084746331E38D5CFA20D139BAAF42E2C435820B6BC15FFD49C5351DF4CC95D6A54797C70B12D651AC1AD454AC5A5F1C04ED285F5AA9F1FD4838B6480604BD823C49B62115F7EE33EAB2004915C5D28F8F92D0E2D1F6CEDA60AAC4904F4E96716AF0B61FC617CE8BEE84D297E658A5850020925025939F40A7B688DE5A0FE63E7C8E325A00BBD453826CB7341CBA613403F26B14A2D1EE7F572567E5AA91068FE6B25FE75A39B7E9CBA5DC6083D7816E3BC7D920B94B9BE94F57D753A57A50D0D0D90F2BCF31A6924D76E6CBD206F8A4A5453D8979AEE4AD755CE6FCD68DA8A57A603AE91B61BF9467B57B1C1C44EC1D209990D5D6CCE10743EA05216301D9AFF620370C4B73F53958FC50008CD0321BFBD456C413346EF968EF1512087DB70AC248F6E3BE2203C05D24C2EC5CCDB6984C152648FBF52967866BBCD18B66EADA25B53DF9EA7AB629B1F2A737779BA1DF7876D8B58F4293D39C35E0F308F6DA45EE1BB9F7C8F086321FE713A7A1FCF136291D8670844417CE71E7A355BBB81AFB659C8E0BA7E1DA8510C ct = F668A8431B3F03F5F70A9E28A063410A2BDF6C739DB6F31E7777F58551EA71BAB049B5BFF630D33BEB283E45BD98C3E6352CA866DED88C510AE1256B3887FDC29EBA4DE9AC90CA050A5DEDD1A9CABC4FA226ED8549738098685C238377317135E7D89C131892DB20957BC2463F0BF14A70FF02F8229C3EC6EB8D681DF6A9A26B5DB663511492FC3B143056E39759C71354C3D37E35E487C3C178FFE571B8A1912645086B9666C4A9CE378E45C17EDEEC4E9D3D63E1487634931130121901734DF37D21D2536121A86C91BC38FF697B90ACB03A173911FD6E79935FFB0E72BC414D28656A826AF328168EB6C92178CB1E70651D4A2C33DF5726337E48A6338D4AF92B145218E411AFC7ABFFEDF5254DEE3E58CFF6942916401C0A071DC20F0AF51749062B4EB26882884ADCDC84E364DDB3A8A66572478ACD4CEADB90530F969A9997CE2A0381FC73AB72431D34D78DB61F28A3E5DFD69EA6ED1C73676EF8CADF40DDB2BADBA6E1AB4800093A1552D61E33C6C9FB1B7CDC61AFBA6224D265D60F1080E7EC860AA7DC6DFD003975FF0B8DB40E5289DB45B6668375D8FD87F0D0786D7D33556EC890513EFDB89C6714949CED388FB352B921648310CE6FD038AAC5A4C8BB42DA68551E8457466AB8F781F81DB17ED8F4432EDDE8C5FDA0B98B62E4C1A94F13CF8210FB60C476B98AC2ED362DA51417CF9F74C67FFFCB16E4AC6D9363A81BA05D2A2124B10D83FA133E87DB9BAE9BAC358C8DEED8FB0B40AED44CED3EDF77D4D1BD10F56364A05B9D45AF03C29C55322317018EAF9CF87DA9B8A0A2979279A0AF16A41AF1F23E9680F4295C9C46501F ss = 3F17024AA5F0D7444AFA1109B97FB41FF183E0D9BD58E40D count = 37 seed = D882BA69AC8BBC88715F1C6387531F53273A5DAB87E66FAA8221A7F628D2BDEEE1CBC59C0E08D0ADD84520A3A70C1389 pk = 050BB34F3238CC191B138A47CF741A711D6054E5B1120EE27B5D4B4E06FCC04F788E0FC5281B7DFC072CFB1884BFAE6B0A45CEB6003E4944C09050ACDFECB0894EFEDEF16DC001727C06352BDAD1CEFD4FCBDDEB73932F746F4817B2E450B712C06FB2DEB79F825B6C77B18565D045B05C5429DE416CFE495E15FA89B42F279CC741F11B0A5E437E6D3D5C4882ECEB1497B8569D7AE233AA30FF3ECB8F8C2065D81B4FE47275431580B27FE46C4A0CCFDF551503327B542E7C9B892394884BBC28270C4B46A93B361E4DD78866630CFF4F90C59695B27C697F9C93A5776F06906D62C0C04135355DB63F146ED2C3DAE17A5578ADF0106FAF9919338B5DDFC606895F5880F8235B37366A7C43722CF556256B5EB11290C3986D5B5B68BBF1B062FBB2414A08FBC6DB80C881E926F68F23F5396F5AF9539761FD24142BE02D8459C08A596C476452F63619AB2A791C58244DE3A7639B62B5E7AF575ACF59F395717407E2CCEC285FBF43255454F39F2236796C82387C038F68B5278788440953B8303234347B37677354D2093D434BA3DD2E879099647A59B83E540E27D0EDD3FE715193BE52166428D77213258F63AE7454BCE15CDB235DBAEDF3F5C1514254C69471AD90B5C32BCA5BCF01C0918BE8687B945DCD4A0C2E8B689498B59BDE3E187E646724CBC06C29A3D6FCA05C3920DCA923CF9A45409B4650E57EE900EF2D2A8F75909A9FD82928C57097EAB5F099CA05C5AC45B6980594FEF7B3A78556380AE7A3FAF286014462555A262F65FBE38BDA1BD305 sk = A1B52D871612A1C611AE0944F9E71858F35D3BD14F20E96A931720668BDF0A6B1F135CF64B6403E103AFAE34DA038613E2853BBFC36BAAFA3C6A95347193F37C130BCFE031E637AE84406A08F8C6F701050BB34F3238CC191B138A47CF741A711D6054E5B1120EE27B5D4B4E06FCC04F788E0FC5281B7DFC072CFB1884BFAE6B0A45CEB6003E4944C09050ACDFECB0894EFEDEF16DC001727C06352BDAD1CEFD4FCBDDEB73932F746F4817B2E450B712C06FB2DEB79F825B6C77B18565D045B05C5429DE416CFE495E15FA89B42F279CC741F11B0A5E437E6D3D5C4882ECEB1497B8569D7AE233AA30FF3ECB8F8C2065D81B4FE47275431580B27FE46C4A0CCFDF551503327B542E7C9B892394884BBC28270C4B46A93B361E4DD78866630CFF4F90C59695B27C697F9C93A5776F06906D62C0C04135355DB63F146ED2C3DAE17A5578ADF0106FAF9919338B5DDFC606895F5880F8235B37366A7C43722CF556256B5EB11290C3986D5B5B68BBF1B062FBB2414A08FBC6DB80C881E926F68F23F5396F5AF9539761FD24142BE02D8459C08A596C476452F63619AB2A791C58244DE3A7639B62B5E7AF575ACF59F395717407E2CCEC285FBF43255454F39F2236796C82387C038F68B5278788440953B8303234347B37677354D2093D434BA3DD2E879099647A59B83E540E27D0EDD3FE715193BE52166428D77213258F63AE7454BCE15CDB235DBAEDF3F5C1514254C69471AD90B5C32BCA5BCF01C0918BE8687B945DCD4A0C2E8B689498B59BDE3E187E646724CBC06C29A3D6FCA05C3920DCA923CF9A45409B4650E57EE900EF2D2A8F75909A9FD82928C57097EAB5F099CA05C5AC45B6980594FEF7B3A78556380AE7A3FAF286014462555A262F65FBE38BDA1BD305 ct = 8F6FAB11360AFF5F7EE619EBA313B18646B5BFD381ADDA31491E03BCD04A0FC1BB8EC10E259567CD311462092280EB0140DF2916398AAB264FCF6F7F04F4C4D900A38547E69DAD17455061191830924CA12ECA955D4705E2E24564C90918705A7BDD471036A00BAA19C74AC34F587D62994EB4A0F9414E62B4A7866E8BE69127474BA8DE52C247FA278300074956E6DAB0D29415D53DD853D67ABE25E5618BE1A3C9F00B997C387386FBB42BC9F5FCB0507CFF43056CE0C397882455D7DF5A21BA9377C4611E434FE1AE8CEDB27C3925250FC9FC42B7D0306A621CFEAB6A71207F1564725BB43324A1F1400C95DB5881B8AA0EB051B49A314EA9348091CC5F404E4BB42624A2001B5A1F3E1D26EE5E61611330CB5DF77B65D85067AD0FC4022AEED705986EF1D80930A4555F40CCEE2D6A2EB825F9FD967617B435BD73648AD946C645B3506AB9441D88E362B971362D3C5FC2F39F8D9A654A98109453680C20FA7179F9ABFA280732DAE2AB056F2FFDDF2FC1075F2B3A162C5E63DA1AF02451CFAAAF87B77A9780D1658ED6B799372B78304A983159E9473342F6829A3E4A95FFCEB92033986F7EDC91E68F872DDA14BBD3AB6C4293557208837B27E81F477A1A9BDB1ECD0DE3A366140165FFC9BFF4927C4DC2B15DE0D80B8AB985EA4C214DEB1756E5B7643B92468426E26CA7F961186A9A6BA5246E512494DC102DBECA035AD245A3BB2C1DB9F2A2879C96078E1978B05A482500CC8AA1DA0A1C882FA1DC06F8A310D425F78DF0F4AC8A25058BAB604D810E03C0A25B8D8E7BD6A6079BBB41989FF30D3919C22069CCF2AB77EE77C9018698 ss = E7BAA6045ACADCA9F95DE3D7E9B9946D85ECDCF683444032 count = 38 seed = 6C3AFF39F5D097096D882F24717718C8A702382DC4AAFFD7629763FDA73C163CF084807BBB0C9F600CD31A7135F48AEC pk = CD132ABB16E823073C80F7357A1B58665198F312DF9C81B77724F90DAD386CDABC3964F2D54745BC31AE53F66FD4B729A3C3C5D113C59F3E971B1B54B17CE5F15FB3E6F1FDB6C09984E3C41D901988762F149EF5FEE665699C51F3FA67075AA681043BAA87CFAFC4ED8D1DD3694B5BE28EB8A60FB6A94DFC77767187B645B7CF7A50B45101CFB15D7EBAA53FA2453A17D177F5F286A264CC5C2E411F870A45C49A033572871B766937A3C9FEFF28A81A01AFF4664A4D2197DA90DF1F51A64512D9A50F866D262ABE355159428CC7F60FE3BA8CAA3FAFAF5BEC628907D182C519C294E03E15E9D83CCB1EDDE3795A1896A1FFC3F45ED470079B0A8A49B5C491755D1153B101F836988390DEAC45CDFF504360721B48F05A87762506C340573CC817A1C5F9070310AC9E11FEF4AC39DBEA77D2B5FEBEC1FEE1A249F1AC60EBE1B48F30C3E9653D2BA5F4794087ED2968A660023C7FBA9FEF9AA90826296C1C254E4A0DB1577D90F681A312FB5E329EB56D4812A7782B895442729377E0B8683D9AB2BC65965AA56056D3184318850B609C6FFC7047044E3F397F9D014A1ED6A701C6E97F26ACBB7A83B312C80574C0EC2087E1EA59AA8B3EC2D31A53C4769CB8C39BC358E1150F8272F6CE132B594F96ED370BD3CAB44FD1A5E5E9DFDEB330BFF8449135B66C1A26E767C7E64451E17AF15AED77D4457EAC04CFFC114E2620C2819A58092BF21B0EB72D3558B166EE0E4B73FB9FC9EDBFD10CAA56CB300AFA228FCFA964B5F69D7349B24DAA0AEA2B2788BF224F66 sk = 952B49C803D6D6FBA69F4375ADCE8594847A00BCAE2179DA49AF2AED0423250262D7033947AE42CA53522A65FBAFE18D3BC3E0CB66164E9A094FE4B44D8977EDC0D0914DABB32055DA762B4A61FCD003CD132ABB16E823073C80F7357A1B58665198F312DF9C81B77724F90DAD386CDABC3964F2D54745BC31AE53F66FD4B729A3C3C5D113C59F3E971B1B54B17CE5F15FB3E6F1FDB6C09984E3C41D901988762F149EF5FEE665699C51F3FA67075AA681043BAA87CFAFC4ED8D1DD3694B5BE28EB8A60FB6A94DFC77767187B645B7CF7A50B45101CFB15D7EBAA53FA2453A17D177F5F286A264CC5C2E411F870A45C49A033572871B766937A3C9FEFF28A81A01AFF4664A4D2197DA90DF1F51A64512D9A50F866D262ABE355159428CC7F60FE3BA8CAA3FAFAF5BEC628907D182C519C294E03E15E9D83CCB1EDDE3795A1896A1FFC3F45ED470079B0A8A49B5C491755D1153B101F836988390DEAC45CDFF504360721B48F05A87762506C340573CC817A1C5F9070310AC9E11FEF4AC39DBEA77D2B5FEBEC1FEE1A249F1AC60EBE1B48F30C3E9653D2BA5F4794087ED2968A660023C7FBA9FEF9AA90826296C1C254E4A0DB1577D90F681A312FB5E329EB56D4812A7782B895442729377E0B8683D9AB2BC65965AA56056D3184318850B609C6FFC7047044E3F397F9D014A1ED6A701C6E97F26ACBB7A83B312C80574C0EC2087E1EA59AA8B3EC2D31A53C4769CB8C39BC358E1150F8272F6CE132B594F96ED370BD3CAB44FD1A5E5E9DFDEB330BFF8449135B66C1A26E767C7E64451E17AF15AED77D4457EAC04CFFC114E2620C2819A58092BF21B0EB72D3558B166EE0E4B73FB9FC9EDBFD10CAA56CB300AFA228FCFA964B5F69D7349B24DAA0AEA2B2788BF224F66 ct = E712C685418105D6ED7E12B2690E3D54AA1F9E3AFDC3E3871FC04A900B8C5A6809DA6B47E3A3FE167C01C1423B992188E2EDB2E717F6E9D6504ED05654D8B23615E3CD94785B4F9CAF03CF19D067AD404B009B49FD3AA84835F24A7E0A6A285A9624F5E1E5EB0CAE697815D1A053BFF8CEF206FF98E40D92D5D689E720103C6053C72712BBFACAFE203BA2671F37CE3E0568FA79152D06263F40BC772DE3E6D5FE0F7D52969C360EADE3FAE88B1C09D8A99C0F670460C230BE40956CE9569BA87F67A864DCDDEE1657BB4F99F9736221D48CDCD667F2B5226EA78224D30DEA093ECC5D64D7FE38F7668010095B1D7FD8CFFBA6EDF228950A3EE0AFA43ED9F042E6F0AEBBCCA50759E12F5705CCBFD4228B63C40173C581B26068C18321263FA975E6AE982A6E0AD28E68980D733785A4B5E27EE39672A6768E2384332A44852ECE606B9869AEEC72102D31C34B104CD0DCB5688C0006CB1BC1DEAF81D703DDF0650FFC2FF68CE2A8989A575C52D83334A15D92687E3CCD6D7558E005B427173090138B137441D407393EE18FF353A7D4B10A283365914DAECB00366CDBE66D1211DA7D752BCC3826F9BEFDFFECAF29E5215BF308D50105E2A25995A42FCA91C667A960A5E3B919BA2B47D13EDA7912FE69848F748F164AEE10DA214D6EE4EA1BC1156D3057DB47A9A5A201C04D55C4CFBF984EECEADABF1D16B755237B0159BA44628A47534FFA8CC6909093F494E1E83FE406A5E13C4B35754D678D7E4B0823A60E41FBB9CD23D6607855D9BF8D3E178A10173E1760A85C55104EFFEDC9574097239FEEED220BE3D56DC8B1D3B07AA27AC4E99C ss = 8E8F4C17165E53DAF73252FC6A18FD83245BC647DE1AE831 count = 39 seed = CF520B92A2E3677AFD003EC1EC6EF136A709D78F828C9C0DD4946EFBD451C5FAABFC83CA66F9D3D17EE4220553B7A69F pk = 686098E480E5080E41F8A5D549B6F0CD01A0D958675398CA84A9FF8204BB1B0682ED50D2CC20EAC36CCDAE30B41F5E7BA140213D5F9CF562DC62B579A4AA2C88BA78E78550F3F479CBACE041B7036CEAFEA95585804D64D4E691AC2E2602FBB6B7A72151D4D932C4C5F4B477AD63CDFCA1D8806104244E859383A91940A7CE7A48C3CE6A6D76686EDAC2BBB2E6811E959ACA72B6D3109C4EEE9722716A15DE9E8D28C09D9BF4E7D9CD4ABBFA4DACB8C5C35F0868C1A390307A87C10453EFAA3C866F3F54E440259DD83D4FA8F435DB3F67272E95F30A9BBBB36A27A16DB65AC0CC014167D1F0F22F216B7E2727879F1FC47E2499CD003B40497ACB257322705ADAF8BCF4F5F3E1C8F88569EF1FAB5994BC2A6EF7A7AB78D6875354E0151F20DA0B0F6D7984AA74F63336EBE99A143879902EA533BAEC45C3550E2373B47A457B984E019A533431957B96A557FF170E58BCFE966A77B61288B77F7D67918D8848140A9A8D17A37002A2C4B4FA70EA1AFDDCAE6C5C788E393693DBA6CAA790D395EA2DFAD973D6031509476C9D1DAB1832BD5874E2EDA8B37D21DA0F348630C3C411BF4A9A41EBECE236B28F34D7A1F7DFC4C8617C38DB7ABC5E44CE77F99F94ADD9A8C11C669B1B880E4BEC15A58E309C730B2CDB9B57CC33B30A4C68D58F77949651366E9D521785151B5F7A36952E7AB3B615A5F839C97B806C50EE53F10C803B50033B657D436215A00EF50CD01D2B5C4E6B8D8E76D3C0C08ACFCD72341BC5350643FC4C0E1165E58C6DE619D9EFB80172E75B sk = 3C815E57E9233E975FA1630208AAB206B71AE0DB37A7A8789AC683D9F9B2D29801C8E376FDB140EE343106C093AF7CB149B316BA79446CEB4E5E0CEDB9B164F9C6828BD9D5A20A8B9E96890A51D20103686098E480E5080E41F8A5D549B6F0CD01A0D958675398CA84A9FF8204BB1B0682ED50D2CC20EAC36CCDAE30B41F5E7BA140213D5F9CF562DC62B579A4AA2C88BA78E78550F3F479CBACE041B7036CEAFEA95585804D64D4E691AC2E2602FBB6B7A72151D4D932C4C5F4B477AD63CDFCA1D8806104244E859383A91940A7CE7A48C3CE6A6D76686EDAC2BBB2E6811E959ACA72B6D3109C4EEE9722716A15DE9E8D28C09D9BF4E7D9CD4ABBFA4DACB8C5C35F0868C1A390307A87C10453EFAA3C866F3F54E440259DD83D4FA8F435DB3F67272E95F30A9BBBB36A27A16DB65AC0CC014167D1F0F22F216B7E2727879F1FC47E2499CD003B40497ACB257322705ADAF8BCF4F5F3E1C8F88569EF1FAB5994BC2A6EF7A7AB78D6875354E0151F20DA0B0F6D7984AA74F63336EBE99A143879902EA533BAEC45C3550E2373B47A457B984E019A533431957B96A557FF170E58BCFE966A77B61288B77F7D67918D8848140A9A8D17A37002A2C4B4FA70EA1AFDDCAE6C5C788E393693DBA6CAA790D395EA2DFAD973D6031509476C9D1DAB1832BD5874E2EDA8B37D21DA0F348630C3C411BF4A9A41EBECE236B28F34D7A1F7DFC4C8617C38DB7ABC5E44CE77F99F94ADD9A8C11C669B1B880E4BEC15A58E309C730B2CDB9B57CC33B30A4C68D58F77949651366E9D521785151B5F7A36952E7AB3B615A5F839C97B806C50EE53F10C803B50033B657D436215A00EF50CD01D2B5C4E6B8D8E76D3C0C08ACFCD72341BC5350643FC4C0E1165E58C6DE619D9EFB80172E75B ct = 8391E1735EE93A75849EC992CE9235FE87F19AB98E6086B9867248E22A645E4D83F2706E635CA4FB267FAD0324EE02F4092E98F0E910A76B92AFF7733FE5C403C52A4F6CC6C0A2215047BC9E954B7E58B58B1BA05B0148FE7B772AC2F301D69827D5158FF1267A48FA2B9E3AB5CD614C727CE45C586C6F5D936B9F7FEDD2442FDAC5261AD663721183DB2344E883F75B4A4A2B0781EF3CAE94FB2D8DE09AC9B59A5B8898367F607E7B1ABD4C0BF54867F9B6576F8473CA745F86413D36122850410337EEB58EACE7F22EC7656EC7E96C2A2F91E9959964E70E8F6A113802EA08134A06ECA9DC46A4E651376A8237773D869FDCFDFDC2CA01974B4ED894D8874DB2335D48E121BA8D0A7BBADB85A86662CB313A3D298DEB787B47F557675D02912FE86F82736C16EBBAB260A987C0E42122F1DB344EABD5ED73F08356C54C4A8C35A6A46A3A9EBA0F91B8DAE8706F5245C51F547AF372960F7777C4A73CADE90F27BB510F32ACB130A7DD9040EB3A5AA9D9F0CF9D4DC21F67DECF422422CCF5256F685A70754D9991289F77F7FDD6DFF36D125A316F23A1ED5CAE52AF693DD8389F4563F576FA27C8F003E8EFD1987C32E5CABD719AFD76DE04AC06099B4039100E9E609AAA4D4C5283531D7979D1A8573ACCB052C430A18AC155FCA85E66D0D73B155298D9779D0B0DFF0B6792C8D112CE6195444A0FB334C73A9E4675674AE53A783DB50CA7694A27169969A00F3DE373B5AD18E0618DC6ADD891CC46BAA77C5024E504542AC5CFA208227AFA1C287BFC0B854051C7420254708A4A39ADD1023624B4B214C3597542F8BBBFB78C3D40BAEA3B2D ss = 573B747DBD2B5ABE4079CE9E2F04B0DF10CE11ADD459FF0F count = 40 seed = 197E5D562DE7E01BED4FC597DB28DC6EFDF0179F3A5BDA5F94CAA39D67BAE730540534D59A7A06C8448F628DA8B7859F pk = AD4437E849494DDEC5420448644E4C113B7ED1C02C746603EFC66A2924EA655B00A2CAD80468916EE6995DCA3EFD59DE38582774E6CA44B5277CEEB871C0958294F6F5CAA5023FC1A552F7145F7C767F84E570207C9A585A6509614F6649945903009D640CAAC9652A455E388FE67AD56237061ED889AD6338880017CF63B19E386BC0ED7624CA3AF04997AEA3109F979EBBBD48E190A763A22E3D5C9F191E4E7211D880A864357FE90706F3E8CE818B9479F955916DC00FA921AD1EC8F191BFB62377B92C1002032297A67872E1C3445B00EB2B58508F35B2973D1E0E92D30472F3935A95A4442D9175F807EE452A8632827927AAFF130E4DD2DF896DFF3C0FB0A4CD1D5462B768D2C99869E273D2E956FA7E96089B5DFA7D189E87139D9F046922B821D09F393E13B17C098B5377D648A50AF2D4C18697825C88D4344ED1C5E62752E44C4209BFDF37DB65768D7B5496D711274AFCF8AC932354C7AA708965AEFC2DC5368D53389061454307C27C91F751847023A3560CE3D9EFA85475A6C1DD5CF8E88B8AFD1A53A7351751B7DA8ED2CE09E02F8FC4C03316DEE6806DAE1F412662C5851FC3B8F843D4B3AC80BB8128F6598E03A10DC2D8A2055F6E705129818F2A1F96D631FE061405F14577C6A5E1667768573607C4559D8746DEE36F428399BF137322878F53BAEE5EE89496888A3C978A99BCE13A190B558ABEE88F2E616A9A24AA53436543CB4260993DB0A6B32522C166950E055888DCD42E1920E51164F4D30E6B22B1D4F3ADFB55B568957AF55515 sk = 588760826DCFBD36D9ABE6AE44A669BB3EBBA6A218EAB69E30F18A3BD536576E0E860576285483BB5FD36E2F944D32C4317BEBC1E441470C1372046A790D79D4F817C85D204EE860346635D4A8393902AD4437E849494DDEC5420448644E4C113B7ED1C02C746603EFC66A2924EA655B00A2CAD80468916EE6995DCA3EFD59DE38582774E6CA44B5277CEEB871C0958294F6F5CAA5023FC1A552F7145F7C767F84E570207C9A585A6509614F6649945903009D640CAAC9652A455E388FE67AD56237061ED889AD6338880017CF63B19E386BC0ED7624CA3AF04997AEA3109F979EBBBD48E190A763A22E3D5C9F191E4E7211D880A864357FE90706F3E8CE818B9479F955916DC00FA921AD1EC8F191BFB62377B92C1002032297A67872E1C3445B00EB2B58508F35B2973D1E0E92D30472F3935A95A4442D9175F807EE452A8632827927AAFF130E4DD2DF896DFF3C0FB0A4CD1D5462B768D2C99869E273D2E956FA7E96089B5DFA7D189E87139D9F046922B821D09F393E13B17C098B5377D648A50AF2D4C18697825C88D4344ED1C5E62752E44C4209BFDF37DB65768D7B5496D711274AFCF8AC932354C7AA708965AEFC2DC5368D53389061454307C27C91F751847023A3560CE3D9EFA85475A6C1DD5CF8E88B8AFD1A53A7351751B7DA8ED2CE09E02F8FC4C03316DEE6806DAE1F412662C5851FC3B8F843D4B3AC80BB8128F6598E03A10DC2D8A2055F6E705129818F2A1F96D631FE061405F14577C6A5E1667768573607C4559D8746DEE36F428399BF137322878F53BAEE5EE89496888A3C978A99BCE13A190B558ABEE88F2E616A9A24AA53436543CB4260993DB0A6B32522C166950E055888DCD42E1920E51164F4D30E6B22B1D4F3ADFB55B568957AF55515 ct = B06ECBD7AE4A0FAD8E4142EB9035B0402F8D8AA822A5541721EC057A46D8591F2630DB6841ED9A65770640CF972D01978EE3CE3154A7D9B953095FE966EAE2854AB430FBBBDEB02934A88E19BDE11FFCBBCDF73553BE2A90A174FE15D021C48898B37C08EE9C46B90F02E39F03E91EC13D70EC5DA20F9D599B8A06A01344B5C6A7782A0F1060402821123F979CFA17DF9B6E8954445104F065801BF6C4013318E960E1063D287E1924197C3C1DEBCCD71CDD644B1CCFEC4D12BAE52915BA0CD40C28C15CF05DA586D345801D6A80C417CD61542B564CE9C0718927EF7C26499824921C3F6A53F531A65CA2F8D24B4E1253E91214360E53B2B97603CCF318A6DD96617DB602D5F622396647FB2EBA38F3E6234143595E4250A8089A40D722BAC8FA801BD3ACBDFB4651E9CEF77FFBBBD4940CE88F70E5111EE609CE9F093AD91D0EA7FE391492CCEF0E2A86C77D699C0BB8A37C150C1DA6F01E2C40BAE02F4A3D3A9919879FF16264E8C9DBEF3C5F58A763571C1A13A13259C894AC26E7BC2201EB2266DF1135DB0880FF310ECA6B0A3092DEB25020BDD61011E17BAB04F2477A6B5C9B6CA6F92FB226A0E737E92BEEBC60C6E1D9D8F4E42C1879CA00D9E250B9332AA0D8FE77DBBF396CAB4ECD7D16292887DA254E0C76CE2D602B96034703CE6E19485A00CE96DB2959FD46BA55E18CF93998CB4DA24B69CB16A03E226834F2568C29845236DF9B1D1067AE4B7F54E35DC25CF96E4CEA8C456FBD1F1FC7CD03DC9FBA2F5CBDD43F5CE8DBAFB75C239ED86AB95A8095EFA07EA2EE14ED7820DAAA5D4478FED5619924389FA60EF97EE1B7E09051 ss = 9B93EFAE66422BD4FA92C9868289992C2540ECF90DA12CD8 count = 41 seed = F170583CB451D8A45D105457C02C01A33A40350616ED8515BD49067142F61EFB00F07857E4FFF3FE11E7164C648C76ED pk = C389329CED27D42A0DAED6B4A4147BC8C63C1214F2E06CFF86F8A44F518A58FF84622060F939871D5A986671C9C292BACA0E2705622EFA294CAA42629179C7E1BA681E9F53C35A993B24896A7E379EEC81A22954787A254752B11CAD0657021451EBEBAE5B71C57D6A73A08A3D3232975DEF031005D12910F17C055B66914BE975B60CC797C2888DBF268C68373D76C7F1AA9B2BBEB62F8DF988172CE8E4C84B80B800ABA4430734723FCB1921A1BCD24512DD6623F07780C6601D1D089E2A11E8FE1A5A36AD2128EE3CE4B183895FEB3B60570DF1DC6179DA2BDEDD3E1A287A5D299D05DB2E41D264823309335D8522FFBB3E93EDD75FF083214B53F51DBE96F657708C31720D7166B7613B3034966822E8345A10F4AC242306176BA57343223604BD0C4810DAC9E861810A4DC1C37396F3B61EFFA0DD37988851516797A937B27C254B755C7B603ADF37BD521B2E000EE77F1A17833E0D823BD87E0AD76EAF3040EEF771B1B38BE65C38B64DD08102C8F4FDEB3F625F00A444093F683C9FAA422DD0756E7919C9EC8169140EB376BE1E8C25B744570C3265EE9DDC5A96B40D1EC2329CF6CFF622BEE73B4E829E2876606F5ACDC19AE84EF6D2E8E2E904AD7FA425BED6B4989818123122368E70D696347FF94961018CDA48BA7F5390C5A525CD4EBDDDA2BC38D585F0B72F94CAB655E45E10BC792DED5FFF9146E1A47D2855D9F3626732BA1E8393746041470421BE45837825A3C82C6A239571D8F8A8E1EF1433F277E5A5F6C20686048B135322F355213B01 sk = 47550E9EDACB6DDCE3D9AB81F6B61080DD4F2693854ACB05E0CCC7A4FB6390FBF89D7D99D5C3E0D10D6EF9AF054D842375F695ABB28E3B8EB495100F04306E92641960502A4293989699C6905C9DB300C389329CED27D42A0DAED6B4A4147BC8C63C1214F2E06CFF86F8A44F518A58FF84622060F939871D5A986671C9C292BACA0E2705622EFA294CAA42629179C7E1BA681E9F53C35A993B24896A7E379EEC81A22954787A254752B11CAD0657021451EBEBAE5B71C57D6A73A08A3D3232975DEF031005D12910F17C055B66914BE975B60CC797C2888DBF268C68373D76C7F1AA9B2BBEB62F8DF988172CE8E4C84B80B800ABA4430734723FCB1921A1BCD24512DD6623F07780C6601D1D089E2A11E8FE1A5A36AD2128EE3CE4B183895FEB3B60570DF1DC6179DA2BDEDD3E1A287A5D299D05DB2E41D264823309335D8522FFBB3E93EDD75FF083214B53F51DBE96F657708C31720D7166B7613B3034966822E8345A10F4AC242306176BA57343223604BD0C4810DAC9E861810A4DC1C37396F3B61EFFA0DD37988851516797A937B27C254B755C7B603ADF37BD521B2E000EE77F1A17833E0D823BD87E0AD76EAF3040EEF771B1B38BE65C38B64DD08102C8F4FDEB3F625F00A444093F683C9FAA422DD0756E7919C9EC8169140EB376BE1E8C25B744570C3265EE9DDC5A96B40D1EC2329CF6CFF622BEE73B4E829E2876606F5ACDC19AE84EF6D2E8E2E904AD7FA425BED6B4989818123122368E70D696347FF94961018CDA48BA7F5390C5A525CD4EBDDDA2BC38D585F0B72F94CAB655E45E10BC792DED5FFF9146E1A47D2855D9F3626732BA1E8393746041470421BE45837825A3C82C6A239571D8F8A8E1EF1433F277E5A5F6C20686048B135322F355213B01 ct = ECB921DBD60CE7259E23006A76D4C1E7A14D767122A893E1D1894B3F567E44C696CFF5346B3881D0F363F3CD33BEC0F034096164D97F722E1E78D80088F21215D1EDC7B4A7A432EE8ED42C49FC5986F204AC0853C940E786496C8CB3C615BEFBD2E3C7E1042FD01BDD0C4372D50DDEB0988738C9397DEE993E8D960158C50EE10BD3F9E8AAB92C31F459250F17330ED1C73D3D9E24FE3E598A5DCA923E0D65DF88E2A25B5F3BA65BB7D11AAD8CA1B224DF87403E1FC9A54B9C2D81116CFF85A7F4F0731BD61956E3D5FC2E75270F474C7198A4950200691E795573C684B29DD3FC7B825B9121E03C79428F50EB798964DED2F0196FC46C71EDC55D00558208C5D304E67064932114AE6875B06BB3625DF20FC69C76E35680772FA479726D941E2808130BC828DF6614665445276C3401BE0283A2AC3DA697776FF34BA4AB6EFC747274ECC4BE750CDF07863797C1F510A5ED5B7E9867AE78D08AE19A567EBFA92EB3063BEE12D16AE294266EC6CF097971217BD6D24F924EA4806233F497D004F0F1F0DABCB222701138E32B54F6593F5EEBC32358D23AF813EBE786C276BB8EC491DEAABE5E709E113938CA393DA3ECE5533ECC5F8B81D1E9EA346828D62EB145CDE600AA3D16CF743BBF961A7F1E56A592CDA5AF50BA05C0EE2A42E6E5964D6F3A24A08A431EF79D2D3EF3C124C02D7FC63AE543CCDBA599066D7878D7D0CC2DE4C77214122957701B3873B4EDECB2B2D281BD517F1E4253A3D074E6AA4764DAC51AA0DBBC1E28F0D611B0BE7D9D15D6B096202D8B5E0AAC67E9FB0950C3046C70993789D022A9F8BE08542FA8F700A3FA1DA3 ss = 28890F61FA78B628AEDC13377CEFEDB28EFCB9EFEB2BFCC3 count = 42 seed = 44A6774B2CAC02DFF210FF861A090561A453DB311F47B6FEDB81811872D5D9489F5FC4103010139AE53FCAED209DC9BE pk = 229F4CD44320FC5162A4C86C0B4323441AFFB5680350BEBD17C4926ACB41DDBED1C3D6B74B0CC2D9569BD4FF199B1CDE87979FE545D5493130A7DAC44683FE18E8A8EBC755EA009AF8250FEF434D8EAA0670FBFD64B5400ED73990DE9D37C2243768C73D0DB8377C3793B17361239771E8428AF010DC217B9BA5F83C6AF46BB92C8E57E8F2EDEF0BDCCA9B1203E0E36738216EA9032D71DB27011F353C480408DF989F36DE9DDB977C2A57231F8BFAC2FEA5A8256B8CB75BFCC2760D0DF59A4CFD8529DC9319E7C44F9B61CBAFB8C983EE32963B0D1ED34F13035F63A42BC3B7E2026456933B7BCEB816E7F47A5A0BC37F0DB395FF719CEBDF2FCCE56463DEEF5D422B581EC840587E0E5BEFB58E4FCA6B365AC89DF622C3DB4DF87E488FA2DA285336C67AA262D2D7876FB7E663250FF34B90CB39B6D087FA9665D16617948A2051A2BA0B1DA3D47E6FB45318A97760800057EC09B44F2362624699D725E74A38331794212646AB5A3C1572577F4451BB2D33FB9B4ABB0FF8AE89E64164024E28194701A829D4A4422CE4C33262FE1339F0666787F779BB960413135A62D4655749B775E053D794AF00C04F0B433927A7635E590590A5212984EA19AA64386D840F393AFC3024D45A0F1A3DCE681CDC640B1682D131DAE82F791B6C1B7DB436E0CE04D0DFD43BC296CB27AA2534D5BA40A7E5D874FCCBA5ABF4EBA7FEF413338BBD9F44E5CED8933DD4FE53A19EB474C43A0B3CF399DFC8237D71347F7C03CC697C14F4513F56EF2BDF28F5BE2896919215930B sk = 610AFB64BE8CC1DF288CFB016EE2F44C6C07113DE7F6FEE071FE0C3FE31C6215CD292E4C5F9E1A55E0489BCEFFB204D672A6215F4F3980A646D9F880817C52DDE963EB230D9043216BFC31722EB2A203229F4CD44320FC5162A4C86C0B4323441AFFB5680350BEBD17C4926ACB41DDBED1C3D6B74B0CC2D9569BD4FF199B1CDE87979FE545D5493130A7DAC44683FE18E8A8EBC755EA009AF8250FEF434D8EAA0670FBFD64B5400ED73990DE9D37C2243768C73D0DB8377C3793B17361239771E8428AF010DC217B9BA5F83C6AF46BB92C8E57E8F2EDEF0BDCCA9B1203E0E36738216EA9032D71DB27011F353C480408DF989F36DE9DDB977C2A57231F8BFAC2FEA5A8256B8CB75BFCC2760D0DF59A4CFD8529DC9319E7C44F9B61CBAFB8C983EE32963B0D1ED34F13035F63A42BC3B7E2026456933B7BCEB816E7F47A5A0BC37F0DB395FF719CEBDF2FCCE56463DEEF5D422B581EC840587E0E5BEFB58E4FCA6B365AC89DF622C3DB4DF87E488FA2DA285336C67AA262D2D7876FB7E663250FF34B90CB39B6D087FA9665D16617948A2051A2BA0B1DA3D47E6FB45318A97760800057EC09B44F2362624699D725E74A38331794212646AB5A3C1572577F4451BB2D33FB9B4ABB0FF8AE89E64164024E28194701A829D4A4422CE4C33262FE1339F0666787F779BB960413135A62D4655749B775E053D794AF00C04F0B433927A7635E590590A5212984EA19AA64386D840F393AFC3024D45A0F1A3DCE681CDC640B1682D131DAE82F791B6C1B7DB436E0CE04D0DFD43BC296CB27AA2534D5BA40A7E5D874FCCBA5ABF4EBA7FEF413338BBD9F44E5CED8933DD4FE53A19EB474C43A0B3CF399DFC8237D71347F7C03CC697C14F4513F56EF2BDF28F5BE2896919215930B ct = CC29A750F319502A69C6C237316543C0CD34CEDD9332F1873E039D472ABFA5474317E4D6DA546EEB6B34AD9F777DA72BFB17892EA7B0835081F987DD1F0A3798A93106CA8D1FD23CC91CCAF738C51CB0B944408F5685B0205E66BE8D52690EA5FB2ADE8B7478F97F7B50951DC5BD8342777D656BC24CDD8B453A17D02FC1FF180CA8277DEE6216189F1DD1E2DE65ACB8588355A03E462EA2C43609D09A6D9B86BEF09474A1F37E198D8ACDFC15A71ED2024A1E7DA2D06FBE4C3B012297B5B4AB05272BFB9DB0F95296A72F51FEAF4A116F4D0361866F1FCC1AAB52DC4F95D02F231C05933DD0BF62EF325E01EEDA21B9635C770CAFF6A2954C45E836613D8BEA0EAA69C815A906299258D6F4AEDDA32C510EBA23574B2C9A4F4C0A758BAC7458C7FEB3BA2154EA086A3FB2E64C1F7E4F18CEBB9A9131957518631AEAF65ABE05D179A908552DAA8ABB71B1BB0D79C1AD82AA1C7E7511F44D42977B38CF40649F4F6D3E31BC3FDAB230193A7FC7910B4C3E577AD9BE00E46814C326E01E817526F832A354EED75346B001F56637462C8BAE569E01641D7FE456D0DE7CE534896B1533F458B83160C48027C0B94BAAAB9337D1E2D9FB3C70F20BF61527F35F787856E402C2C6672AE5D1EA74E05F039B0D948182809025F5486F6327F387C6A2A4BE8CB4CF3D456BA1FEA2C19544EBCCFE1ACE26F1FE20604B8D21B403A470B041CF4D151499B0E7BCD0910BCF81DED2D733C643225E581AF8D5E39E41AC320882EB477BFB77D309F7446FC780179D02343BD7F010ED810B634C4E1A3D747B2FB80E0A36CDBF2A3183895D95D03079C861A8152D74 ss = 65AF106FEDDCD1C5C4104DD694F6631E24AC314F757C6F05 count = 43 seed = 49E1855588B6235DF2A400C4A70AEDF8AB17B6E5E2891AA745F132FA2E7AB0C8117C1DF37C39F5D57624EB77C2B4A091 pk = FA4AFF9316421FAA7CE9A6AE013F213945ED98612444C7D945C5372591F201DB05E3819B84FA27AF03B46CB7E304A294A71FDE1B42B98EB5E84574F6362070FC096594EB7D91707A25EE817159846BB1B07011AD4B5479C0DCEA09EE094E6F4A2B48D90AE2D1D20E7F891F578811B97D2BB0D3D143D4FB0F12F8433F445D9169125E0D54580679EFECBE05EB179F09B9D2018886513C40660AA53B71FA3485A24F1F272158D2DE5BA1BEED925F69AB913030DA8184D06CB281FAAC27F63C21B50C8ACB901AFE7FF021D6DD27AE451815297C6783B4F49A55EF27C92E9F7B4CC3ECAA7FDEFFACEAEE51116E8DB1DB39B1523439CB10521DD8F9C379F9B757C8FEC084AAF53CA0A708D2C263EA64632890590DEB1481E86DDDD655AD0A0E54A4147AC9B36E23D3A1072D498F3F554FAB8ADBB193DFB7995B653D6957417192DC8DD2D226538C432C708F342EE49A121260C2296C5D6B7245A389C81E4DDDF8A6AEB38BF3BDDC63120B9B36A488E6D24BE922C6797B2153145538017167257970CFF5AB03FD6334CB571474D609E48B6A848D83E77CDAF2391DC6B18445C8D686618170E06D70CD8EAC809454ADBE15BCB6DABBDD79DDF3BD1EEBF7CDF68E271F4ADC1B08E6344F559553C5E8F2CC7B583F39138BAC435AC016B3F6E942A2D36CCE5BE5CED62A9BF2C805BF1509F6086393567D231F44C47009713B89BFD269BEE16BDC24D2BF4E7E5FA919FA7568CE52A0EBCB65BFE8484A160755B362D7B9B2675D7DDB4CBDCBF28B3B900C4F678DF1AA11256F08 sk = E1953800ACAA85AC02A906C72CB8E8D704E8D27820345F88F71E89C1F549AFCC8C64C049C6DFC0F1476CFFD520B055756162F7EC94243DE6B14AC0B9E5FB366C2EBA73D4AED17740C1DC2B67CA15DD01FA4AFF9316421FAA7CE9A6AE013F213945ED98612444C7D945C5372591F201DB05E3819B84FA27AF03B46CB7E304A294A71FDE1B42B98EB5E84574F6362070FC096594EB7D91707A25EE817159846BB1B07011AD4B5479C0DCEA09EE094E6F4A2B48D90AE2D1D20E7F891F578811B97D2BB0D3D143D4FB0F12F8433F445D9169125E0D54580679EFECBE05EB179F09B9D2018886513C40660AA53B71FA3485A24F1F272158D2DE5BA1BEED925F69AB913030DA8184D06CB281FAAC27F63C21B50C8ACB901AFE7FF021D6DD27AE451815297C6783B4F49A55EF27C92E9F7B4CC3ECAA7FDEFFACEAEE51116E8DB1DB39B1523439CB10521DD8F9C379F9B757C8FEC084AAF53CA0A708D2C263EA64632890590DEB1481E86DDDD655AD0A0E54A4147AC9B36E23D3A1072D498F3F554FAB8ADBB193DFB7995B653D6957417192DC8DD2D226538C432C708F342EE49A121260C2296C5D6B7245A389C81E4DDDF8A6AEB38BF3BDDC63120B9B36A488E6D24BE922C6797B2153145538017167257970CFF5AB03FD6334CB571474D609E48B6A848D83E77CDAF2391DC6B18445C8D686618170E06D70CD8EAC809454ADBE15BCB6DABBDD79DDF3BD1EEBF7CDF68E271F4ADC1B08E6344F559553C5E8F2CC7B583F39138BAC435AC016B3F6E942A2D36CCE5BE5CED62A9BF2C805BF1509F6086393567D231F44C47009713B89BFD269BEE16BDC24D2BF4E7E5FA919FA7568CE52A0EBCB65BFE8484A160755B362D7B9B2675D7DDB4CBDCBF28B3B900C4F678DF1AA11256F08 ct = 3BDDD9CB33CC6075767BEB510BF769A48382A77C7D47B25399CD6DDF108F92EAF835DDD7A82C3CF383094AB9AC04D924343148E7ECE7A7D5D7039777689664D233B0D9F684D467D55CC9FD1370326C0F9F69394629D07AAFF05FF8CB6523D0A0A12675B67B624A5E2F8C0F035089461E541223A3CD80F3A382617ADAF559D274929A015723DA7459735BA94C0DDF1276398DC9C010E4EF2FECD556B1A4FB0AC45997C9B0994C36E67823B0082C43705F10F7BDF97781B6D54491A20CE286758EE78FB4A361F3B0F57BFE8CFCEF9E66AF0CB7FA18A737FA5AADCAE7EF8B927955E5FB023C707564FC5C46E2C5DBEC2AF2A36FF97219AAB0B53DBFFE82C4C05D5FD1914BB455CD67BFDB5519CCA5B56E41649826F1F2A84238073BCECD86568E878989B6FBBE99EEE77835404EA540EFD781F2D6D2C4B07C2F8DF00592355B8BD09D65404571BE99955B3EFBB2BD712C400A6A767F01EB4B57305ECBCF356BA5E5F881462348EEAEEB8E14DA4433815A1C1D7DF19F9A887B35B6AA199FB9301EAD96E8B4B1169A288A32A718DF0B4AC81B040597ADF086F84F46EA0A9BBDAF83A11A01C18DBC5BDD54BF290EFCB951089F531C2197CF8AB3B0090D243D44DD91D434122D1BCD96D665B6D0BB4A108799AF763E2DB95501A5A9B91C20F2B4F8479742633D04D3319E9269B5F01AE7E6B43A6FE0CE8CC72FDB514C0BFB583B9E8C265F0EE14F7782ACA7DCAA4E26B98981F8E14EEBC251D429423575CF8818F31321504AFF240AEC72087A00ACE19EA4FF7A2D1749658EC3DD9F268290D908733DCF5B38F7908698FBC2896F8484E81D6442E2A77E8A ss = 35644DDE6B7B579B137DC4B58D28B46E6DE14DC504122AFC count = 44 seed = DF0E41D2F6F86C1F79D31FD5878E7AB434FC0AF3A0D5F47D2AB3FEF31A42BD949B0E3629DF9F575BEFBB62E829E51DAE pk = 0F46BE822D7DB090AE6A1265DA749DB74437CC326B94F629C72C9BB6661A6DA4F7EAD1FB57A62B4BBAA1E8379E1665DFE424A181A8133C9C81CB104DB3ECED1E57A3C3220C5A3342711577A208E5CA47078F841DC71AF84DA13EDD673A03C2736B940866613AE47CD282AC461FB6940A307C3756D07E6626D1386759F6A1CBF7FF76C543DDB5981F4DABB4A92BDBEB808FB40CB25A5ED0673FA60FB1073258D67D1AED4AF8BDDB77F6FEF86F104DB255AA9856B83114706D51907B4EC9B6D30615788A1C51A23A80A8AF6967ABF7D768DD3F499878DC97CABF07052C6CBD80D04F5594B99802CA3C50119664660412E56F3FC8A1CD240EB8C8DCE4602B09CB67EF3FBD2933C48BA37F8DB896E8F0F848C5AFFBD590C09DCB250A7A79763C06E8901243127F19CCD423AD430B8B864396C6162030F1F3070AA6D0A8FBC1BA9A835AC93A39CBDB372D95DF3F7ED2E779CF8ED7CB5F59D48FE589AA450F3BBC1C09E601E52447C04E23E934863655F8E525E0341514E8A4FA26F82BA15481F73B9BF76BD0DED1896D07AAFD5269324F22C3451ED612DDFBFBCE6882165EA74B75F5A492B44C7B16E4FCFB36314C8DD183CDD67D4C1CE1C7AF7E4ACCA09136B891D93A354C77F395EEFE16329E226D5336286F8B0A93590BCCAC100270B51D4974295C0FC90E3BC1147D9F912EA15411BC041296D055ADCE5D55EEE75C40330FDFEF6B0230750D37231E95F0EAE423CD30B89DCDDC5914C85DCA2866B492D66DAB243AE2C49E95CCE6CC2DFB2FE2A82F0BCBAF0A1A01 sk = C719F9B2D16399B7326CE4ECA30DABEFE8FDAAB18E9F6DF888B0A134EF355570E40771856EB77E4633504899FCB86C6A3D433D0B8D60E26F07BD61F1D4ED69BD43ECB0987E039EEFB08896A033E7C7030F46BE822D7DB090AE6A1265DA749DB74437CC326B94F629C72C9BB6661A6DA4F7EAD1FB57A62B4BBAA1E8379E1665DFE424A181A8133C9C81CB104DB3ECED1E57A3C3220C5A3342711577A208E5CA47078F841DC71AF84DA13EDD673A03C2736B940866613AE47CD282AC461FB6940A307C3756D07E6626D1386759F6A1CBF7FF76C543DDB5981F4DABB4A92BDBEB808FB40CB25A5ED0673FA60FB1073258D67D1AED4AF8BDDB77F6FEF86F104DB255AA9856B83114706D51907B4EC9B6D30615788A1C51A23A80A8AF6967ABF7D768DD3F499878DC97CABF07052C6CBD80D04F5594B99802CA3C50119664660412E56F3FC8A1CD240EB8C8DCE4602B09CB67EF3FBD2933C48BA37F8DB896E8F0F848C5AFFBD590C09DCB250A7A79763C06E8901243127F19CCD423AD430B8B864396C6162030F1F3070AA6D0A8FBC1BA9A835AC93A39CBDB372D95DF3F7ED2E779CF8ED7CB5F59D48FE589AA450F3BBC1C09E601E52447C04E23E934863655F8E525E0341514E8A4FA26F82BA15481F73B9BF76BD0DED1896D07AAFD5269324F22C3451ED612DDFBFBCE6882165EA74B75F5A492B44C7B16E4FCFB36314C8DD183CDD67D4C1CE1C7AF7E4ACCA09136B891D93A354C77F395EEFE16329E226D5336286F8B0A93590BCCAC100270B51D4974295C0FC90E3BC1147D9F912EA15411BC041296D055ADCE5D55EEE75C40330FDFEF6B0230750D37231E95F0EAE423CD30B89DCDDC5914C85DCA2866B492D66DAB243AE2C49E95CCE6CC2DFB2FE2A82F0BCBAF0A1A01 ct = 17EDC070F9C08F22F02709B8C2423F919D97A1141B3F5CF97675BF0F3B15898B5782BEAB23CD8E379DD0127EED2B0EDB3B60A33227186BB994AA5FC4268DE7C7FA52E59915AC81058EE90B13A979E93C7D9B88ADF24C5C401555FB2E7A2DA9B1AD7AE057F57A22BD001C18007537A7B63A2BC2A10D8DF7F8009D1E055BEEBC8B9B8FC557E4B2D4EE6E1FB7FA9DA2FFA812F1509EF6C380424F55F9C9CFBFB9B385646D8C1864775B2DF6A769C7B819CA8801D54F273722DA57C99E27E5AA0D915E13BDB84DF5A6E53DCEEE8EFDBC3957DFAE9B2B63EDD0998BA12F3289F09B6A5122133120F6D0D8005F9DA724CE60F7CF0B620DCCD9AECE6A93B82A13805DB57E389027164C56C1CA560D35C8E60CEA3B87D08C17344D7E2563E61DC9C99F3D4328CCE04E2C634C1EEBDC0B2E24B6CB524B28E4D774285A3F38CBAFAE9C4A8B40963A86ADFD5477D2F80ABA351B1BA93BEB845C60CC1B55D2A28545B64406989E56DA3B1B4B253C5349E1E77153CD228E736935FC11A66730ABAC1BC68A43AA0226433F08036BD17B061F43C427F18ED91AD865CEE2EF82CD9DC12A5EE3BCCA848337C3C7A4B0EA572B595B5795DCCD59DC04525B45BF1FCCB3AFE1B3CA48B8F84F117F629559048C5440CD57AE58F3858A627F464559D6911F1394D49914A9DDD57032B84E5997A731C9024F3A54939918D6FC21B415C750ED33986E0D2C1C62B9F4F644C31A314D23A04CE9BBAF81B6BFC6F5B93C4CDA2CBDE443734085EA0D3B5700382BAC1AE5C90EB6DCC0FCF4E026186631799DE69928796767ACB0C722B2A118FE8C9999FBAC78672EDBC874B3F9F192 ss = 7720877910626AD0640126F39004EDA846FE953D2E6E4B4E count = 45 seed = D3C9EBBA6EB03CCB5C9B9D2C8D7F0CFBBF50841E24396CDDF0E56525B38918C2FBE6C34CC1B93F7BCD4F4D5777E1A488 pk = D9035033E33C8DDBE05B0A32CEB1158F9C01E30F978052E07B65CD5DE2229370F63E052CC1AE952FDEBBD04FDD54EB3CB508A45DE85B016AB5AAA4D8E6E867376E5290962564DA9B244171AD29E1A6FCCF2590560E3DB007FC6BDCD9A9551F2841D75913E2343D09EC63A11BD0710D826771D8D47BAD441F53E5463BF3ADD5D960F9EDB9402E4C5ED075E985A82C9B804F8B021128B009F8A8F77E03D9A01A316D71C1CD7077F9785DD9CBC1F94318C5C555E1BE480B2C3BCA3DBE55BE861BA9F72932AE7CD8AF018F961EC7D963511C10B8685735288B35805A64C7DBA79733302759F722BBF49948035388F1609E05AA75E557EDBE0E64D978C33988FE5E5A1985468AD82A1D0B003854D7832FC7F5C4161E00214279EDD13764CE912B1BD76A57CFBD211235815BC50D8062500B9CE4ABDA645E916F037578CA61E5396C000E160CFAF6375EA0CEEA98B8A58C771F8822B1127BDF3583D826E2A4A62E66E0102E85B4696B982AFAF502D9060BA60296DE9AE8D58573305BD235A90DE623CEDEEF3CD09A7F47644591ADAF300DEDE98EDC612EF189F614BEFE5F58B2EDAF674EC797D29002AF4EE4DA7E53CB11785A7325BC8C31B89A4DCF56D05823494D9E94E5A827B5B11913D6A5E481A8207EF9761D6C49B4339134E505D253800150E2F2075F7939B388C47F1269E5ABC4F8946634FB65C0C37C335D828CA9CD21775760CEC610E55C0A3F604DABC72DC8AC826B26F234B880603FD24F1136108AD4B5CE0815377EF1E656E7EEC8A78E70B6C21E795163 sk = E9ACBB774BE970206C3A738E243B420805A509FA59FA902044BE2F0D013650D2DED5EDAEC5DE3BF5B4D7C2F2E18E87F499C1968993EFF196753DB8045E2C8BA8EEB442F8E281548F83319144EFE74100D9035033E33C8DDBE05B0A32CEB1158F9C01E30F978052E07B65CD5DE2229370F63E052CC1AE952FDEBBD04FDD54EB3CB508A45DE85B016AB5AAA4D8E6E867376E5290962564DA9B244171AD29E1A6FCCF2590560E3DB007FC6BDCD9A9551F2841D75913E2343D09EC63A11BD0710D826771D8D47BAD441F53E5463BF3ADD5D960F9EDB9402E4C5ED075E985A82C9B804F8B021128B009F8A8F77E03D9A01A316D71C1CD7077F9785DD9CBC1F94318C5C555E1BE480B2C3BCA3DBE55BE861BA9F72932AE7CD8AF018F961EC7D963511C10B8685735288B35805A64C7DBA79733302759F722BBF49948035388F1609E05AA75E557EDBE0E64D978C33988FE5E5A1985468AD82A1D0B003854D7832FC7F5C4161E00214279EDD13764CE912B1BD76A57CFBD211235815BC50D8062500B9CE4ABDA645E916F037578CA61E5396C000E160CFAF6375EA0CEEA98B8A58C771F8822B1127BDF3583D826E2A4A62E66E0102E85B4696B982AFAF502D9060BA60296DE9AE8D58573305BD235A90DE623CEDEEF3CD09A7F47644591ADAF300DEDE98EDC612EF189F614BEFE5F58B2EDAF674EC797D29002AF4EE4DA7E53CB11785A7325BC8C31B89A4DCF56D05823494D9E94E5A827B5B11913D6A5E481A8207EF9761D6C49B4339134E505D253800150E2F2075F7939B388C47F1269E5ABC4F8946634FB65C0C37C335D828CA9CD21775760CEC610E55C0A3F604DABC72DC8AC826B26F234B880603FD24F1136108AD4B5CE0815377EF1E656E7EEC8A78E70B6C21E795163 ct = 509C0CCCEBA396D2C6CCBFB12A0E56832B64E7B15A5A8C37BDD59BD429433113CB95978AD5FCB065EEC6D1462A9C3885C0663346D9E76023ED3E06CEDE8EB89B0EBF1BFE85E4FC7FE31E784223507D27D1BC5B85A03476212429C4987915EFB6D609A41480CDAA2DCB91ED73D9CB9CEC3CBA0CB80E6E54C0C22ED1585A27FF763CDB1F5ED813577EFD8638654EA6F888C5EAF8A79A870E9EB2CE8B7268331218C16C4B4D8AB50F95DFB525DFEAED49E8B3439E19586B0F94485F7329E52C26B496AF7BBF98AC8F02E996EE9B253BF8D5FCDA90021E2C7D6D0007EEDD0AB90C2EA5B8A691C4660DCDE275EBD3279B1B94CE051530849B402D863406D0578ACE05149D5AF84633ECA9C62AF7C9A8089184413DF85E9AB0027A851556D54EF6E1A4A0691EEE959840C6821921CBA8CBCDE8A59CEC93481CF8A8147E73D96CEC5BC024AE74D6D8E1388713E5336AF86C3342241975C86DA58D773FDE16E0B946E7274BD2192D8A95E2A8E1CE39460F7908405B6D06ABA30EC552C4B3CD6CC5C0F63C5EA999BEF65B5D07F065E79DA1BDA3945574F490E3CECC30E9A949F9FFF0E13EA2F1094BB1B48BF9EEA7784BBEAE006A0254A44EDCF844981F00F1B453720743B86D798C785103E45C37B096CFE3165865852D65F75BD663331E93A6BA11FB293055155D541E0591D3C9DC1D3A918C7634F13FCD16B72257AA6D075AFBD003EB45B5AB0AD5E2367686F648ECAB7F715984EDF20F1BDE06B3BF0581C9B9251D7D07FB66C72EFC58C96B8F800257A9EBB7F23F655DC4DBBBBE1AE9D28B0D82040081020F9AD06F2305F2917CB3607F38972927C54E ss = D9466545970FA9082C0EFADA01015334084CC805AE7D6BCD count = 46 seed = 6B3996E8BC6F52879F2B7BE012C44AD555707CB7E5FD8ABB3457A298336D6FDC9EB7853008FF13201D5969A315C7E493 pk = 159F80743F1EC97C05AF92976734BA0CA80F1D1E91D0B4831A52EE2AF2862A41D9419009528A8F1D452D0760C9B2AE3F2DFBDEB95C700790FF50DD3D2B05D1B945882DD851056C630ADE192A0DC5767D0E466EF9679642F0392A8F10D72471451DCB1FCC583ABF6D43D0490CCFA0400AD125203A0D8B30AA6067CC91E974729EB269828246D6E4BA436A46C46354EF9B49DFC479A9B48ADF7EF2298D67FDC523DB7010D4BEBF0BDD3C9310B38C910939A04EC4F8685E842283B14545B5A1A719BCB32C1CF16F9593B915609A3FD44A9AC6C1A6BA483579D11D4238FF2BAFF11A039416FF9218BA3608A2C038B143E4558967C338313B9DF6688AB8A0FF3D69D2F48FB9EE48149D4F5FDA32E21FEC1287BEDCF171E97829F03A1EB76FE0349AE8E92D5404421553E7D568F67A73C968AFC462769D58132D427BE3605FF5B63AFCB007EA06BD92F510C4632BC861E254D324DFA47C6D25F7640EBC5135989CF1E127CBA42A3375546916AAB26E5E8A08DAEBBC0EC8464ED0204228699452F2304D4B88CF9FA175A567322E0289E2DFFE8F1D0EEBBE0595E12035EAA0B4C52E55EA8498E27FC5941CBA577F6590DA7E0A4BCB83C77F8881EE9649B2798E37C45696BDC77608AA36E42B415C0FCC8AB8244393B1A8A71357F8FBEBF1E92D6BEF93FE39A105FC22EE7C2F62952FDACA4C70E094F1EE8B8A8256C8F890E6A8F76F35E65B028076E52C8019D1B05EE7CF0390800587651F7A2CA9C305AD66F78D7C293F8CE9A3A1E1BF08D5C448457C680A1442D37A2C0D sk = C1B3CBFFAD4B306F9AF0CDD3028876486DBE858875C9B6497FE20172A986C82B1C96249919CEDC2369D8D739AB125E0D2CCB82DFEBCD90240A545CDFE07511F2F254CE4E29C707FF6C23D92678583701159F80743F1EC97C05AF92976734BA0CA80F1D1E91D0B4831A52EE2AF2862A41D9419009528A8F1D452D0760C9B2AE3F2DFBDEB95C700790FF50DD3D2B05D1B945882DD851056C630ADE192A0DC5767D0E466EF9679642F0392A8F10D72471451DCB1FCC583ABF6D43D0490CCFA0400AD125203A0D8B30AA6067CC91E974729EB269828246D6E4BA436A46C46354EF9B49DFC479A9B48ADF7EF2298D67FDC523DB7010D4BEBF0BDD3C9310B38C910939A04EC4F8685E842283B14545B5A1A719BCB32C1CF16F9593B915609A3FD44A9AC6C1A6BA483579D11D4238FF2BAFF11A039416FF9218BA3608A2C038B143E4558967C338313B9DF6688AB8A0FF3D69D2F48FB9EE48149D4F5FDA32E21FEC1287BEDCF171E97829F03A1EB76FE0349AE8E92D5404421553E7D568F67A73C968AFC462769D58132D427BE3605FF5B63AFCB007EA06BD92F510C4632BC861E254D324DFA47C6D25F7640EBC5135989CF1E127CBA42A3375546916AAB26E5E8A08DAEBBC0EC8464ED0204228699452F2304D4B88CF9FA175A567322E0289E2DFFE8F1D0EEBBE0595E12035EAA0B4C52E55EA8498E27FC5941CBA577F6590DA7E0A4BCB83C77F8881EE9649B2798E37C45696BDC77608AA36E42B415C0FCC8AB8244393B1A8A71357F8FBEBF1E92D6BEF93FE39A105FC22EE7C2F62952FDACA4C70E094F1EE8B8A8256C8F890E6A8F76F35E65B028076E52C8019D1B05EE7CF0390800587651F7A2CA9C305AD66F78D7C293F8CE9A3A1E1BF08D5C448457C680A1442D37A2C0D ct = 8E520DD6CF871B61C40E72EC70C302161C5B4AAD3CE34A3551E74CD899C3544B4F2FC27BE0F161EB21E92CBE14911AB64A7EFABDCA34DFF50B1A1738E200EC3167DCF9F903306302A050669EEE8C9330D767E3B00E3F188CB29ECA216D4AE7C36B6A7AD458570E5706D6AEDD82C2490609CE73A1EEC0E828A180879C4F28BF53636F01FD918FE17F83FD780E373D6CF8BD1D6AE7B0FFA371A2773AEB25E19E36F8F0AC6FDEE23FF8B7AFEFE8293FAD702DBE90569FADBD0155818A32547FEF2E6214E97CAE8D7EB896C0E4062A7BD89A0B157CF1204AB3ECE96DF401C8548FB93FEB29F71F9ADE06574D99AC2871AB64432CECF15045D43A505C90986A43B7C5C3C7CBA6006BEEF076C78E78790871A53FB58E498C44B188B659A20436010752DA5047ACE4F5C015EB9B4E0203278B8EDBEA39CC32423E29B0995D4548849C12CBE4D40EACF3D01D77A4685CB390677ADC6E500E9793B7434E788ABB724A8E4B57DD1D6116A6FF8EA9A4BE760F1C805F094FC3B1A1AB842B4B6A397F304CC2BDD363A7AF53DE5C049C3FEF00512D9E1687C85B656CCD8C01CD43BE0DF02F6B39E218CEE23D08B22C4F4F7FEB16FB785E9AA27F72401EF128C0307F36AF075CD7ABBC7615DEAC43322A0ABEF719F1FCCEC7E20134902E69298653E588A5221FD401A39537E3AF85ABF65B019591D5B1A89C93EBE8AFE29257409296CAAEAE8917B2DB1E4A4E1BF9FE9FA1F224A2B93C2165DB13017DB4D4E6CD762C47700D7BDDB5BCCD06DB4A5D0728ADC585DF7135CFB961AE00D87E079AF4A02EA2F1189146B24F0757D3B753F27B7AB7B5D761751B12466D67 ss = AE3AD0B460C59A237A7CE1E067674E8A28CB68901B07911F count = 47 seed = 730B65ECE22DE27D573CE3AEA7CB021C415DF210D228808D91D4F380070FFCB0778B683C71D4853DEB569C822765F2A3 pk = 6029F12014BF8680C6961124D93E64FFAFB31CBC82795B4C0954F6D1083CF447220F3F08F3F0716C06EDB10CF0EED2C596250CB04B6C78E1EC605CE670E56837522FC8465BA3FA872C6EDD0705188C4FD431B543C4CBF6CE2B05403F1912F84702F87E5F92D71BB9BFA771C556133FA2EA0B908DCFC973266E79DD8C2BAEF78B27026A339D4446EFCB14F2AB785FFFE5DE6D172B796BD388F7795890B559290D65E5C0412FD607E926D1BE363431D599FD34D8D1946C5686C6A991587F5A6287F2D7CB323CB4F452D4F5D49D3F55C1EBBE03B5269B166A16B2EBF101AD141ECAAD0040B0BA89C8B96A779DD69E53F7879025FA5F11EB1BAF924BE5C65745C3DC68A435002A4B82DD7194197E3A0E7A1E5C9D2C597CA426682933DF89D30AA8993725C27C17499CF1A9D8FD9F5888A513066C03A19949913AAE75C4087A9165176C62A6DCA6CDC63446B8C686D6F8E2059067E67E89437977B2C91728C852EB266690543D2F6415D88B98F912228D48C67884927ACCD2035D45B6D325C560622D763EF969A9B250E15ECAD22C5F3C2A6EEC3BC3914EB431524F2DD4FD26D39796581D4664B226899D8828C0491557A9D412FD242E9E616914C5981E0578F19169AD02274CE5F9FD5460E356FA9533A36A97C362586F2B223DE9E15254FBBEDAD6F70F867299DDF725FAA26F2712D99B354DB3F073837D68DA5CC3035122F1A9942C34472ADC29EF2F7004860B9E43AD959838AB67E839B761C091AA016B4FE74793E7120944B1CF72677C595DFD23AA1705885369 sk = FF7495B8575B5A98E4FD21FB4C3E58CBB60F14BEF21AA74CF8802E3153F14807BDC370460375A778D1A31D01C42B66367ED8D9E8F84551002F552F0E52102B5D1079345C46623B897C14635FB5051B036029F12014BF8680C6961124D93E64FFAFB31CBC82795B4C0954F6D1083CF447220F3F08F3F0716C06EDB10CF0EED2C596250CB04B6C78E1EC605CE670E56837522FC8465BA3FA872C6EDD0705188C4FD431B543C4CBF6CE2B05403F1912F84702F87E5F92D71BB9BFA771C556133FA2EA0B908DCFC973266E79DD8C2BAEF78B27026A339D4446EFCB14F2AB785FFFE5DE6D172B796BD388F7795890B559290D65E5C0412FD607E926D1BE363431D599FD34D8D1946C5686C6A991587F5A6287F2D7CB323CB4F452D4F5D49D3F55C1EBBE03B5269B166A16B2EBF101AD141ECAAD0040B0BA89C8B96A779DD69E53F7879025FA5F11EB1BAF924BE5C65745C3DC68A435002A4B82DD7194197E3A0E7A1E5C9D2C597CA426682933DF89D30AA8993725C27C17499CF1A9D8FD9F5888A513066C03A19949913AAE75C4087A9165176C62A6DCA6CDC63446B8C686D6F8E2059067E67E89437977B2C91728C852EB266690543D2F6415D88B98F912228D48C67884927ACCD2035D45B6D325C560622D763EF969A9B250E15ECAD22C5F3C2A6EEC3BC3914EB431524F2DD4FD26D39796581D4664B226899D8828C0491557A9D412FD242E9E616914C5981E0578F19169AD02274CE5F9FD5460E356FA9533A36A97C362586F2B223DE9E15254FBBEDAD6F70F867299DDF725FAA26F2712D99B354DB3F073837D68DA5CC3035122F1A9942C34472ADC29EF2F7004860B9E43AD959838AB67E839B761C091AA016B4FE74793E7120944B1CF72677C595DFD23AA1705885369 ct = 061A86DC4A78A873E781A2C0D14463E50FE3D916D27037723D959C1BD9E9B072349C598E2D57CF11310475CB9ABA311601F32005584C0CEE57F5FA93FA0505FC89CCDC40FC970AF004D234789031F67C3D2273F759725BA281F6759EC35630947838E3726A8CAB1C7CD8EE3989714008A2C8D477DEC1C201FBAAEBD30968730EDBDC2ED32539331DAFD842D0593AFE99E457367920B0ADDF72C64451FE4A47BC42769E2045BD499A39A97659E3B584FB0B2CB4588E862FA1297C7A1AC671D5BCDB6DBB3DA2AE43B5D31DE197238DA0380DFCE0B0B99DFC8121E8FF8531480F3C33B39CF7F6AF92F8F66DF88B3225C63C2315B96E1F3DA4CD4D5AEDA6E4CC76DAE228CCCE5F7EF0E9F76A527DD3909FE27E0F491A3A9742C7862B83AF34355CE64BFEB37AC5911CC7E36F08BA97F9F060B2C7F4CD5C435E8A77108949E1735DCBDA6430873D7DE962904000824302FE20A8ED59B83C877C45DCDD095A6245FBFABCFACE3172EF1DEE76FB92C654871090FE787C1DA99EA613F2325FCD636734438BA9812753B4DDF898BBAC138ED2B4296D083572B47BA739E2D827F42429AA3A2EA46341B4DEFDA0EA3E08AA95918CDCA1B2CEBD0FDB13D67B7A05AFED2C49421AD572CA92542312FEB09D6AD48EC4F4551AF620FE6E7C0341002649B1F8D91B3AE87176F658CD4CE517E1B1EE39E76D3E243404F3091EC9A0F39035EB03428BDB64E85B6055AB328E1D50F4DB6D46B11ABEFCD92FE12A613A802A523B297DB53F5AB99006DC37F762EC96777EEEAE23854A8F61A7143FBD37EA6331329B03F23518448892BD79C3C8A8B55B2DBE613C106B5E5F ss = EC8E0712C19918D1D2724AE502AD313114EB79D4ECFBBBD4 count = 48 seed = 5522A5A891A9A9B5514F4556AFD8DF40B9CEC63A01492F0CB8A1DB073A285A963E4A9FF2376C88662F7D8D241F8ACF17 pk = 3773155325AE7F1509AA3F09301BB61A775328C11EE896627192DE45B20103005ADDB3F2424CFB1A5A5417D8B849CF38EB8F2D8800636DDE83BF9AC8457213A0680DC4969EE4DEE0A67901DD575F0450A4211ED5CA4C7D63C5981017451A91B7252A2B343A6D3BA2A3F137832CAF372C5FDBBE6FF4C0ED34FE8DE2B23B75AF68499E71241D64E18FD6472D272F8280C67B28C503C9B2B4D595AB0CF2AECCC3492A6DA3258A7FBBCC1657E4997A1BFC4F821C9A3DA3855D71FCC7AE686C9EF5EE24B3E2BE9E90D845E1EA106B90A0888CCA613D39C169C54A567586DFEB8A6616C09F1A7480C82D10DC2698A3BE6567883317FF66C36B70D0EE09ACA8EC9153A0C7B18A3931D5A59C14B65A758A4BD2ED9F96043753633929C629737E61067657FED3F5502A6E113B57B6A0567481533C5334FA3D551FEF27E8AAF8DD5BCB4C07EDA70F652BF498B532C5154895EA68A4ACC7EFCA42BE0B3315A59811C43E85AC104B755C5A19359EEE2AAAF278F026DE2DF1C80914B724409F8D29A07B26E07A2FBF00806D857882CE400324AD000B4FA8A4151872B77BE50912431C635EA8CC845402A7C3BD67DA778B32B752091830EB80A529542BD3D9D8A1D4B2063DD81AADEE4672F18FD4181502B11C36A4C1B1B7A60F062C22C3656CF578B29DAD688F50BA0E1F66EBF789E2A7C14AF7686F69B7AB2625C9BC0A9144F3D2178B1F27578411CEAE12A735A5C4CB88DC1ECCABCE54CF5445B7A9DF81FCE583A458AF801CBB56555351159690D7F351AB88BBEB1F83249F31 sk = BDC3FBA1C32751139FC45BACFFB3EA97F26573D804A5F27A459293D95190ED8EFD5A08F656A6EB8CD20679930A31CAA6A6331C4B133A6838C223EF9F769F6246B1C126AF949A371C0C30FF2C2FA353003773155325AE7F1509AA3F09301BB61A775328C11EE896627192DE45B20103005ADDB3F2424CFB1A5A5417D8B849CF38EB8F2D8800636DDE83BF9AC8457213A0680DC4969EE4DEE0A67901DD575F0450A4211ED5CA4C7D63C5981017451A91B7252A2B343A6D3BA2A3F137832CAF372C5FDBBE6FF4C0ED34FE8DE2B23B75AF68499E71241D64E18FD6472D272F8280C67B28C503C9B2B4D595AB0CF2AECCC3492A6DA3258A7FBBCC1657E4997A1BFC4F821C9A3DA3855D71FCC7AE686C9EF5EE24B3E2BE9E90D845E1EA106B90A0888CCA613D39C169C54A567586DFEB8A6616C09F1A7480C82D10DC2698A3BE6567883317FF66C36B70D0EE09ACA8EC9153A0C7B18A3931D5A59C14B65A758A4BD2ED9F96043753633929C629737E61067657FED3F5502A6E113B57B6A0567481533C5334FA3D551FEF27E8AAF8DD5BCB4C07EDA70F652BF498B532C5154895EA68A4ACC7EFCA42BE0B3315A59811C43E85AC104B755C5A19359EEE2AAAF278F026DE2DF1C80914B724409F8D29A07B26E07A2FBF00806D857882CE400324AD000B4FA8A4151872B77BE50912431C635EA8CC845402A7C3BD67DA778B32B752091830EB80A529542BD3D9D8A1D4B2063DD81AADEE4672F18FD4181502B11C36A4C1B1B7A60F062C22C3656CF578B29DAD688F50BA0E1F66EBF789E2A7C14AF7686F69B7AB2625C9BC0A9144F3D2178B1F27578411CEAE12A735A5C4CB88DC1ECCABCE54CF5445B7A9DF81FCE583A458AF801CBB56555351159690D7F351AB88BBEB1F83249F31 ct = 65038DA6E3CE0D10FC027A768ACD8753FB570C25A04EC30E8953E1D329D20C18A9EAD95DDCE1564B7EB5C1AE593516789A03BD04507664CE9DB58F9BDCB4C3AF619C78DB0B296C87BB1B39A96B7AB58932B80FC3F773EFB165221929742E0438F3621B73F241000427550CB2A74F71DBBB09655809FABA36A695E970826D9F95B78496FFD99A6DC9A03B56670A47147E3B65527A1D3075E64D90FBE342ACB3655F363CE341D974FF5313AAE9DC9A25CE94E5337058437DE2C1BFC05EE3C8754E7C433A26B45546811550890D9254678C2CDC2A2A60C245080A500C8A35BAB7C0EC2D7F962F3DBF0B08C9467E5C3A148C703A993A7FBBDA26E58355F3782DF0D5C2879433C1D516E8988F6AB1BDC2F948E03C177E1B0C6CE6B747A91A750232367146DED5E2049C414C7A49295ACCF65427876AC3FE226F9AB6ACF54EB8E9BA9B4005165AC5D065185B10B6732EF5F56CBB6F4AD7FB33EEE2B2CBC2C38D3072FA4A89738D2039B6D9E30CE245B1D2C71574F88EB58262476C1775887712F25EE46820B390CC8A7B820706002179D7881A3E8B5DA8C4271778E860B21735A897BD13E3F073C6D0892ADEF429D01074BA6BF9975DAE6CC433B5B6FEFFD96500A97EC2571FC51F6778DC654486FC60B3E65F48449C3D2C555E086C1B36F4F64F798EE02D2BD1DF60175AA0AB3BD14EBC45CF2189DD7BA8128B07915F16EEA521BA86A5724B7462D58A7E1DC11F2575978F116CE22539702F5547F5312821FFAD77F63D6F31B19A30D2DC592191B200FBC25A519B5303BEA888E1441262A4E36A601412581086D524A36C5C254A4152829799AECC9B1C ss = B020509ED15C5E325C817221D677E6E1F987205D2EEA201E count = 49 seed = 1853E72329353B3F89AE6A1B1EF700DA8ED3C10D19F9E61EE9252E28EBB0E15802EE43083A12A0B7527088832605E3AB pk = 5B6912CBBAF2CA130CA0C351091129F45D92ECA0F66F2EE9C96F072F1B4D24F04AE7E77E70FE256AE7FB6D22A3B2FE8D3C160CBC0FA5DB1AC92CD5BA0E65C20F648C08C3AA7480BC95D83119C79A89BDB843B39BD24313E976957F4F3F4B72864D62374D39A923780BD54A97E7AD750790FF4157F55CEAB06ED883E777D41D7A3891119647E5F130192FAAB245AE96BF38BEED88644FCDDE2F1EA065079C0E25BFFC068CD5E8475F654E3CF59B09ED101817325FAACBD4A0FE8C9941B116A5460139BFF774FB4AC236F33C844014C66682BDB1A9641A38471EE93913156E666E30876433A5E7D9BD3E62A7231C9AB6BFFE625C4322B3A44CE890FCD0ACCD42AC4D47EF7B70D8B30C2EC28958D2F141E714D08D7F5CA7C51B7A3B01826E3274341B4818295F7134482128C89088EF9F2EDB93393602DEE0EA323741BF0A8CF83D5FF0113930236010E55A768A29680C4E8CB95DBE719413E340FC8EFCEB6626FC82B2857C0659603D6F4C993A51D6893D0E0CCA8ED014E6531F980C2E7B20F0A5321DDC90637A411766CD7958FEDA17EFC143B674B3A726B9E93A22970A5DEB008522F14B4F302069AA33DA078AED053DAE4566CF19E2CE50F6C110CFAD1ABE6957239D2521A8B716A42AC08E485D039D5A62868A5810E02718632A251A98F9B4874629B7B06D085EEA794CB373C5206C2E109137720DD5A32E32593F22942BAEB8554F1F7EE94E4147F742F5B4820207BFD82742A535318936CD49647D4841E6D310D00D3468380A0A87B2CC4C4E7759B8AAD03E sk = 447F6076A627BBC5AD7773FBFEB14B4BA9AC43A0F8B99FB6DCD5E452AA3C47EC20A7237801F470FCC2BD9FD7BEA8322859B850F7882D362947432913DD068C018947AAE799ACCE17FD368D5E1B6C0D005B6912CBBAF2CA130CA0C351091129F45D92ECA0F66F2EE9C96F072F1B4D24F04AE7E77E70FE256AE7FB6D22A3B2FE8D3C160CBC0FA5DB1AC92CD5BA0E65C20F648C08C3AA7480BC95D83119C79A89BDB843B39BD24313E976957F4F3F4B72864D62374D39A923780BD54A97E7AD750790FF4157F55CEAB06ED883E777D41D7A3891119647E5F130192FAAB245AE96BF38BEED88644FCDDE2F1EA065079C0E25BFFC068CD5E8475F654E3CF59B09ED101817325FAACBD4A0FE8C9941B116A5460139BFF774FB4AC236F33C844014C66682BDB1A9641A38471EE93913156E666E30876433A5E7D9BD3E62A7231C9AB6BFFE625C4322B3A44CE890FCD0ACCD42AC4D47EF7B70D8B30C2EC28958D2F141E714D08D7F5CA7C51B7A3B01826E3274341B4818295F7134482128C89088EF9F2EDB93393602DEE0EA323741BF0A8CF83D5FF0113930236010E55A768A29680C4E8CB95DBE719413E340FC8EFCEB6626FC82B2857C0659603D6F4C993A51D6893D0E0CCA8ED014E6531F980C2E7B20F0A5321DDC90637A411766CD7958FEDA17EFC143B674B3A726B9E93A22970A5DEB008522F14B4F302069AA33DA078AED053DAE4566CF19E2CE50F6C110CFAD1ABE6957239D2521A8B716A42AC08E485D039D5A62868A5810E02718632A251A98F9B4874629B7B06D085EEA794CB373C5206C2E109137720DD5A32E32593F22942BAEB8554F1F7EE94E4147F742F5B4820207BFD82742A535318936CD49647D4841E6D310D00D3468380A0A87B2CC4C4E7759B8AAD03E ct = 29DE586CC60DACB027A20E7D98C3D9E9952EC4DF6F73EC0FA123FDBD032C198477AB73B4B80EA35A18ABE9CDBA39EF047D39BD97F58914435C4922511FD05D42D75408ADC9B3F52339F6D6BFB9DD66A1F2981EBE6BEDFFE135AB5732A71D90806D16A43231157ADF0FD7EA262BE1DBDB21AA0A0ACCE8152E32920706E640D73FD45D99804E533E5AE4A2A8CBB9C11758C91FDC72B899D3DD454844F4DF09DB971B31B95641DCFA5756143A411777250730ED6C42696B931B58E829024A86F3C4161DB4B91CFA31A265ED0BEB474A19317A5E229558473049B92AF1B4BE90E5A5B3AB3A66247CF06965460B864D850399DFC921B8EE1C822A5BA1CDCA781E4FCA046E494BB7EDF031269CA90193B985019287F0B92F826ABBB301F09169880C63984BBC3E8B859D64C23D4662DC841AE1ED1BAF6860AFFA90641E99A0473386F4FD700801BD8263171888639C65E9A6929FA2051EC86AFE58481E6E7DD9565F7BFD0DA33AABB2653BD49159BDF2BCD9D824539A7C3B136E17BF193AEB614F783E923939BB747EE84CCDDA16FAAE76BB732F21FF8F8D301EA015E1B5D41B65BD9FA9DB0F6D700FF8AF21910FF3264B3B22A52CA65136BB1D9D27EF15A11C8A6001DBAAFDD687038169EAA4A738673B4AF79FA289AE3E5AEAA9DADC44D43E1F9012646D4C4BD004597C6CFC72BB94AC2828ECE4F5CB563C3B24A161CA79517A7C6B4B3B7EC342D6D9A459887D09F3EE81273C6CFCB4AA9E34249117BF7480E94F0B380F20EC25274AEF44AC927140FCB1E76997DF2F62C2CD8F81C6DCEA0C9EA2891C235FDA831972298CF86AE6312622F3027DF59E ss = 837E0C55476DECAA51EDCF570EDDDC51545458B4629D266B count = 50 seed = 027C3D5847ED4470931141104F25B19AE76117CBB64B224EE424FFB782E9A0E988839E0BDED0DF666FE8E5FCBB5DBC09 pk = DA12C51211A9DDD32F2F70239AB8F5DE24A70C6493ECCFE7AE73F1A4832517469B36E0AB5F9E2E1BD306DF88142A25A4C72928C41E47CAF8DAD1C0362D59B23532DCB3688BFD0EA017FAE46AFD0485144D1E158F9C83B15FF69E1FDB2E47AFD9D5AD92ED614DDDC191AD4CA3069C3E2BA6B2B03DA95C5BAAF0F5C7AD2091195EE6A211021B86CA3167B8C44C2E5A273125FB18A8F9BE4237D318B0B20DEABE0552FA062189DA27F00DD17EFE7315365FF82A3FE377DE5A52E6A0A8240DB382ED66BD3E3EF68158DBD5B75A7244054707959392646613E715AA2749AA3FB6C01D2B07C5A2F49EBA6D928CCF735D20B1BFEC52D88309590208CE4F87A6845F8F09BDF1D30E871D9AC674002FF465D3321DBA1DE6008255A4FCA912AE0681D9CC03D139896DA9255ACA9F980A76D85E3BFC97F557E15139739B10EE503A902E1DDC9D334FC33A9BF84E65A1E544EBBBC1489EB8DB93FA667D32B7880F5E5E3AAE6EDDC8C3CE9E5310ED6A2B7E32B7D134B83062C03535758C5D97850EBB66F85EAC2ECB6F6DB43B5DDE7709AB627CCF12E8FD61870CF9ABCFEA4A91F57BF2142F94740A07B78D0B3D4CD886DDEA3FCCC118126C6723C9091C7C02EC321C465B577C591A891E1E5CC896080064CD3E676B0FB91522A9DF3D3911651F20802FE43CB3DA111A54EEAFDE6E73082D7BF787C90AB9DC6E69D2C40579C14F90113685BCE5EDE14DCFA9F114E4FF329700BB36984054AE5C6ACD243734D11A72BC54039EC04A9841449CF863A4A35ACF9F7D30FFF388251D45 sk = 2D5DF64D62CB07FE630310BB801C658DBF3D97993E68626745DE39D37FBFC2B27B534537ADDABA4ECF14F02AB317D36CB9F0F50222CED7CF029DFF8A0D3D2FD9AD11C88352139F355097E0FFB2E7EE02DA12C51211A9DDD32F2F70239AB8F5DE24A70C6493ECCFE7AE73F1A4832517469B36E0AB5F9E2E1BD306DF88142A25A4C72928C41E47CAF8DAD1C0362D59B23532DCB3688BFD0EA017FAE46AFD0485144D1E158F9C83B15FF69E1FDB2E47AFD9D5AD92ED614DDDC191AD4CA3069C3E2BA6B2B03DA95C5BAAF0F5C7AD2091195EE6A211021B86CA3167B8C44C2E5A273125FB18A8F9BE4237D318B0B20DEABE0552FA062189DA27F00DD17EFE7315365FF82A3FE377DE5A52E6A0A8240DB382ED66BD3E3EF68158DBD5B75A7244054707959392646613E715AA2749AA3FB6C01D2B07C5A2F49EBA6D928CCF735D20B1BFEC52D88309590208CE4F87A6845F8F09BDF1D30E871D9AC674002FF465D3321DBA1DE6008255A4FCA912AE0681D9CC03D139896DA9255ACA9F980A76D85E3BFC97F557E15139739B10EE503A902E1DDC9D334FC33A9BF84E65A1E544EBBBC1489EB8DB93FA667D32B7880F5E5E3AAE6EDDC8C3CE9E5310ED6A2B7E32B7D134B83062C03535758C5D97850EBB66F85EAC2ECB6F6DB43B5DDE7709AB627CCF12E8FD61870CF9ABCFEA4A91F57BF2142F94740A07B78D0B3D4CD886DDEA3FCCC118126C6723C9091C7C02EC321C465B577C591A891E1E5CC896080064CD3E676B0FB91522A9DF3D3911651F20802FE43CB3DA111A54EEAFDE6E73082D7BF787C90AB9DC6E69D2C40579C14F90113685BCE5EDE14DCFA9F114E4FF329700BB36984054AE5C6ACD243734D11A72BC54039EC04A9841449CF863A4A35ACF9F7D30FFF388251D45 ct = E8109C2E33CE8140EB0BB30F73DDA0A90EA234E885DFBB92C7F0C5CA04D3995FF397D62D2EE6ABAD07D98724CBF2FB63DEF8BBB4CFE40B6F7D788FB5FB06FD74FBB011981D976C73192CF3C0D425A19D40307A1305ECBA0AA97C863173023805357F7CA3F5F6511ECB1D272BD6DD3FAEAEB2452BF32B3CDE86E47B54DCEE5658CB831573C491A3AA5729EF63278DA7DF3DDB6A9639B17575EFB3BA2F9EC1DDC23C42318F91772CB9E798CA3D005613F45AFD83156B639FD6D1FA962D5EBBE45B618907FEEC0979A9BCA111772395023408E2ED5BA197A3E30448FA3AB7943CC3FB7FA5720E787DFAFBD052B6EB003DC1D89364DF55CEB32663F9D9E367794768D41B61364D0E693EB9E515AA68A2682ABA449FE941DC5A90931299FBD495808A6401F2CC239FDF3EB5313D311772CB4A3A7162D97E8FA0ABA933736DAA2C5742456CD88B9FA5744780278680DBC27BA432F40B4B976EB7089E95D90602B7F69222BCD902D9831FCC943AC974F744034430714813EF15720A3107F47B6460974990A2AFAC23D1495E9A30E4CCEAEAA51704A4ACB6AB9C64CE9DC6D9B5CC309923883319DAA22B66351253370AF3754B376EEB83671A1CF8EE7D91B571176BBEA50CE6FF17BE3AB67DE8781A9DF3957ACEFE06AC16A95E291E174DF392BC70D863F14D114628135A225B6232ADBF2D5659F44BE487EC0B61A426C7A89DE1F156447E9C3316D345DFFC31199043AD47EA6B93F864E4B84768CDF135A4C900B0A7A74D7FDEA8BE351CC47145CCD580FFD4CBCBC8635B0FBC7E9A0878AA34ADBD9457C92D3E7C823610DC3589199DA1A617FD3F0E1190 ss = 38F138B31C1448AF3ACB769D33B9ED0768BE9EC6C6103D96 count = 51 seed = 450751D4401737459C6D93E6C5F2FBCC4A3AF7CD7250CCF404BBB817A67BAB7B4C9D0EF4570BFE25CF919DA331C31D88 pk = 897AA793FA1A343C94FDF82B1F0B989DE87AA710CF2FF5209D90D4224677736D0F7EADC8935AE7178594E9666FDBC0FFC061C9AD2C2FF26A29D77E104286E7A5F152DBF765C50619AA3FDCDBBA3B1CC5E8F138176DD7AE40574560F4B72B33260675FBD98CE4889C2C4DD2116C475F2BF4FA4B3D9DD4F1DFC683F0190D912B8BE7A31474B5547EFD6949C750D37CC2EE88E6B3010929216C92596C3B82C3479F12DEE86F684047F897D86C55DAC2507D19CB44A8C7275496B0FA4104A123A4352733F1BF0C9FFE82B66731A03448FD6D7FA42DF000EE70FA26F5198A0A58C38FD78E45DE7089058377E811D0DE7F61509FF3A0818F7E7AF1A5D7559ADE708BD48E9FAAAD477C0C85CF3A44250F5857FBDC1F60ABB975B8BE480922B015D0EF6B603B7F4A3AD39A668E425C33850990F6CFD1324B5A16A7E7CD2D45DBEAEAFC49F4BA5B735AB545B634A675BBF141B0CE04523A8666EA57F5A2325EA768C9AC719055485C68B26DAFE264E0B983D78CAED33EF33F781F3D36B63963B8EAA600F055E601670C207276D5F2C32ED61D2B9E6A62DD9C0A230C518D09F0D3238E47F58A77B132EF1D81BAD59FD8745AEBBC6E5602081643B6E19069368DFF0EA44BB47D57B25C4168E654854A71F10BDF91E868DA5891E253E2CF8FFA81560228F20A08963E6C6218BD85B79E11662B4EF2992396C9BF6639B01C88FB535A8007EA505EAED0135B5FB1C8416F2989243627DEBEDC6A90B52C3F4C9B8CA9BC51FA4736899FAF0689ABFFE16B967CDE2DE643B9B6C01A24 sk = 25056D1B8113BB362DD979D98643D7A7AC9C4F95994C0BA060609B6D07002FF3F48A9254DD40B117941FA35A66BB50296327B725525DEEF70E128CA8045EC45129C76D04EEF82CE39E21F4C96A5A6701897AA793FA1A343C94FDF82B1F0B989DE87AA710CF2FF5209D90D4224677736D0F7EADC8935AE7178594E9666FDBC0FFC061C9AD2C2FF26A29D77E104286E7A5F152DBF765C50619AA3FDCDBBA3B1CC5E8F138176DD7AE40574560F4B72B33260675FBD98CE4889C2C4DD2116C475F2BF4FA4B3D9DD4F1DFC683F0190D912B8BE7A31474B5547EFD6949C750D37CC2EE88E6B3010929216C92596C3B82C3479F12DEE86F684047F897D86C55DAC2507D19CB44A8C7275496B0FA4104A123A4352733F1BF0C9FFE82B66731A03448FD6D7FA42DF000EE70FA26F5198A0A58C38FD78E45DE7089058377E811D0DE7F61509FF3A0818F7E7AF1A5D7559ADE708BD48E9FAAAD477C0C85CF3A44250F5857FBDC1F60ABB975B8BE480922B015D0EF6B603B7F4A3AD39A668E425C33850990F6CFD1324B5A16A7E7CD2D45DBEAEAFC49F4BA5B735AB545B634A675BBF141B0CE04523A8666EA57F5A2325EA768C9AC719055485C68B26DAFE264E0B983D78CAED33EF33F781F3D36B63963B8EAA600F055E601670C207276D5F2C32ED61D2B9E6A62DD9C0A230C518D09F0D3238E47F58A77B132EF1D81BAD59FD8745AEBBC6E5602081643B6E19069368DFF0EA44BB47D57B25C4168E654854A71F10BDF91E868DA5891E253E2CF8FFA81560228F20A08963E6C6218BD85B79E11662B4EF2992396C9BF6639B01C88FB535A8007EA505EAED0135B5FB1C8416F2989243627DEBEDC6A90B52C3F4C9B8CA9BC51FA4736899FAF0689ABFFE16B967CDE2DE643B9B6C01A24 ct = 06F255002A4804965B98F51635165FDC299ABF9B48B78EDCC75B4DD8E227116B72A443A5995175EA5C277129B7422A9B40CF619A3D765A314CED58B110DDCFC6BEA14DA9436CB6C5233FE818BCBD6BC6CA38E84D381D2503DA734D9FDB15015BD5AAB8BA2B74304EAA7CACBF4DE63DDC69A9646151ADDBCC3070C49DC10F92D5FFDD4018818921BC94306C06BC2DC517795BD6377D3AAFBD588F6B4BE05A59B286DEB6C419AB39F9EBD4BE8D8DDC27F5AB720439AE4D5E8CBD548E60E90BC2C112F8242311948FD79E50D9D4EFBEC5FA7F82B0504FFFD3F7EE793B560992432891F8C2418B8F11B851372A36CC8C0598B9FE436D4C4573542A536913E1EDF9895C4AA8D2AC893F7EB362C5E3A84BFB70458002CFE13D379BE25D9E67C342A6D780A4A4D8B891862A0E10127783F04F90F8CD324D11366AA62DB2EF85FD4475391AAE811A2AD2CA2DC75EBA5B4C12FDF124229883C81C49A652A0CC232BCFCCE586900FF9F843A2294B7B89373861B9C7C87BCE572619232E0B673AE14AF7AED7D4935AC2F02E48C01A4A1D6E82F92E0A36CA6E77FD5A6C7EDB7C957B400501B2B1E5F34E861D151F0B18E023881D987E8628CE04D4337664B942F840905D473252D0F2F2F85E25922A78E8F8DAE3296179CDD1FB362DFB09FAD3218F7B7CAF618E1AC2B8F0D6B812C40C4E681E9AAAD75C16704B0F0C59BA1AD2579FA5E8E1E3ED17F3A8DAD1988DBDFB13D015870A167890D51BE496EC81F7FA781E175EFB2EED6CB9FFB41DBF57073FF98E3A58AF3B8506C010C8378AD5A3003E4ABFC0039E57ACC2C4D4E4483F7735BEA0922C9D748EC0DABF ss = EB35438CF570CDD33B6A4D31300B568291F53F327EC3212B count = 52 seed = 5DE720F2D152BF4E1F96A61E7AE5F1BED6B8548E32638C2CCEC9F43B87D1BB43DFCF334F0582984D27E440D519AB662F pk = 4A2721A92E1FCE486A619554F3FC33B1B5E5FCC4C18D94C181E75AABBB4ABC4A39DF640C214B3D173484E88B327EBCD886041368F018218F898EBEF8A8E378DE8B6B1F0197D7CD7ED1B2317EF9EF0C24E037F304D1A5D5206852EF4AFB659DBD2940BF820FD15424E85ACFA2FDCC1BC94EC7B30C8D5E1E64E62FF065A34B1CD58CD56A8F36884B5391B53A7B9AA591922BB12DAF22518543B4CB82E9137CDFEAAFF2C3A875927005E6F7362D01A0C03DEFC16DE526154FDBF6B1D26AD831D635BDD0C7665965F3C20A79BE548EF25B2B7C1F63AFEDA215B6BC233AA6B131A8213FE683BB4EA1E29B089C763A630AF7E20C99CA47A46B01E400345155E03F7A39DF9A4F57A008B1531492C0E61F52E9A23DF490FD054D9902DC3C553C57EA0AFA621F86282591DFCB09C164DCDB7EDC28528104EC574EDFB8A5B148CC477F9A51C41AD54AADFFAA0D1F9CFFBB4185EEDB3046852D09D23D23540A6DAFD940A10703871027E348705D801A0045C21A1B7D5EEFA9E096823C4F916D73E6BF6F1E526F2AE2DA7C38485E379F676FE0D68B564656F1062B0C4B8801D9A24EAF2C8C6711DC08A2E589DCF60E8D7B850A582F56DBB0A57225561A120B60C8C161AA80996C1AD7ADCEB6DF4B81870013EEA9251ACD2F3377ED0F0FE61907F2CE5FCD237B8BB813E9A80351AA14BCFD28911AA98787E109DC5906BBC7FC740234E2A06075ADB6C86FE8B7E51D20F5FC7797C88482DEDE36662268CC85903C5D7B22C95CCC32192C68BBDB3840FF802BE954213CE5CDC1BD47 sk = E4D34E12982AEEB1D62FD488D9B9E28557ED3429292239FB4F76FA9098009ACAE6C45C7FC62329B13C8D29844405DB8FF6860DE474BF727ECD19E54E6E1A141BE969CCDB4A327CF359BF5A383E2A90004A2721A92E1FCE486A619554F3FC33B1B5E5FCC4C18D94C181E75AABBB4ABC4A39DF640C214B3D173484E88B327EBCD886041368F018218F898EBEF8A8E378DE8B6B1F0197D7CD7ED1B2317EF9EF0C24E037F304D1A5D5206852EF4AFB659DBD2940BF820FD15424E85ACFA2FDCC1BC94EC7B30C8D5E1E64E62FF065A34B1CD58CD56A8F36884B5391B53A7B9AA591922BB12DAF22518543B4CB82E9137CDFEAAFF2C3A875927005E6F7362D01A0C03DEFC16DE526154FDBF6B1D26AD831D635BDD0C7665965F3C20A79BE548EF25B2B7C1F63AFEDA215B6BC233AA6B131A8213FE683BB4EA1E29B089C763A630AF7E20C99CA47A46B01E400345155E03F7A39DF9A4F57A008B1531492C0E61F52E9A23DF490FD054D9902DC3C553C57EA0AFA621F86282591DFCB09C164DCDB7EDC28528104EC574EDFB8A5B148CC477F9A51C41AD54AADFFAA0D1F9CFFBB4185EEDB3046852D09D23D23540A6DAFD940A10703871027E348705D801A0045C21A1B7D5EEFA9E096823C4F916D73E6BF6F1E526F2AE2DA7C38485E379F676FE0D68B564656F1062B0C4B8801D9A24EAF2C8C6711DC08A2E589DCF60E8D7B850A582F56DBB0A57225561A120B60C8C161AA80996C1AD7ADCEB6DF4B81870013EEA9251ACD2F3377ED0F0FE61907F2CE5FCD237B8BB813E9A80351AA14BCFD28911AA98787E109DC5906BBC7FC740234E2A06075ADB6C86FE8B7E51D20F5FC7797C88482DEDE36662268CC85903C5D7B22C95CCC32192C68BBDB3840FF802BE954213CE5CDC1BD47 ct = ACCF5F25E420466691466EB6E0B52D039F88C6D58DCD155B74A16678780EF40B7267EE20AE994A1465BA8D78543D70A5909662B840EF8D59075335CAB4CC10DEC25B6CA3591DAB4AFEA17EA30860F49EDC183A479788F071E27C7C162D2033F3F5494D68020CB54305421BF7ED558A1ECB71C745AE4EC1D67194C5180037AE5C847A0278473A8BDB84B40AD79343A1FB98DB636E753568F4ED678601504B9041651C39D60C7027D5E0E578B05FDB097EC01B70D5807FB1A61F6B7D2C3C4632568DCBB78F47CE5A7171596D182AAA12BAD205638CE78FF8510B64F9BF1A14F7D47732B8AFB56E975868192760EE4757162557754E7079722B40F24BBDD722904C39B4EF9424E6864F772D5D130C9C01B8973F1A1C905C01564C009CEDD8B34C5746018F3A5E6C81CA4AD77811CC8BBD5B5BF448955EE09BC78315D7739B094F16690DA8D567B237D933DB02DF22343FB2CA3FBF578F1E23D3ADA6DAB1BF6A128984E2414CEE5B5FB2842E37E5FB59C63212F05ACDF779A83F8D2A5310CC4A36472EA288A52043D18E7D9B4976D3BFF6F03FDF06FD25FC25CA88DF2E5E3438F48C186867D98C8B7BFB4EF3A249C68C9D92BB1250C73D24774A7B6F7337E050989D6717B9615976E4A50663A5437FF9AD0BB7DDFB62B81D71887438E34A603D9BA0FFAFE6430F7F95F4160D63052DE867730CE4CF3488B020CAD2632368C9E78C4CB42C8DA96C8D617E1E172C2DC6CD3799D810853362ACC6AA77EFF149E7EFF5A1B7FFB2B750670E7B9C358445F59D792E4201755D79E08D94B684530252F7FEE85281A83A4ACC0477F0E43057B1F195733876375E ss = 431B06B9BA969D719FE1FB4583CDEF9BB973F064FABEC7F4 count = 53 seed = D71729DCBB27D7CB39E9E905025D3E55C8602EFBCC483C9B866EBF82326157833169243C14550AD728BD1470F39C642E pk = 0AD6B8D5DDCEB9BB5E401804A84124CA7E20881CEA38D00AFD1EDD5948348D1DA94C9BE9C440A5B60EC2CC72C8EBACB8FB170322E71528178D924410D0C5B90EE6A5938E28CB72DB50AFD78B9EE1141A9136CF3C49FCFEFDD8481E2ABA37C006B872AF673EB1036857AF21EAC5DF72EFCE88330EE516F5ADC4FFB6FCBA442774D3197BBA57C77FE187FA8BD0F0CD3513C214490402FB8B7254425CBDF0243C2E0A67209435911C18A96FF50E9006A57714C37702F388B681A1D62D32DDE526574B1D105E4EB31B31089CDC522026A5D874AE30D3775AF707903E70258D9D788D1DB95D482A8A47A9A24D7DDD8FC82841ED7E3A25975F86FDB0F3021D5F37635413E75F0E4500C94FB1B26C4719D4834354A07F8A98F2D04D2D663164C6272D5C5BCDF58D83A6FB1F86B6467C9AFD6C8944CF6AC51A58DB5835A6EEBACA31A847D1206F80F097E7E672DF52A43B1A70B6976CDE91F6957447FE4B21F5AC3C2FA757313FCC9A3FDAEE8FA0143F6751C393878D6AF979297B464CD0002EAF1C7FDF8EF6BE8780FA827C3CB95CD7E3DB2660DD53BF4155BF160F725C806491C7FE0233B8847022A5C01256C957C1A41A69BA4F9B58F5DA7DA7FB6B8D76E509F5C293F6E07A574343A1357569AD610DD3088859CAF483E641C04EBE1354141C4B13199DC2DE68726180862345AB8A18F1316AEF4C3D5E07E468E0A67E1EFAC023C30A7D37678C65863427B890244FD0DE658D5ED9B05A8E1D111492AE6AD5DF906268D8B2040C65153108FEE3039323A0EBCD89A63319 sk = CD6A99396EB3539CA663A51E42063A3A262CC1C5A5FCE1566F0597B52AD9FA325A3407F591791A5DB4578B5972093A95BEC3B8E70C1D542C9B5C9789729F89224C20F816F1146AA1493A0CA6BB1E1F020AD6B8D5DDCEB9BB5E401804A84124CA7E20881CEA38D00AFD1EDD5948348D1DA94C9BE9C440A5B60EC2CC72C8EBACB8FB170322E71528178D924410D0C5B90EE6A5938E28CB72DB50AFD78B9EE1141A9136CF3C49FCFEFDD8481E2ABA37C006B872AF673EB1036857AF21EAC5DF72EFCE88330EE516F5ADC4FFB6FCBA442774D3197BBA57C77FE187FA8BD0F0CD3513C214490402FB8B7254425CBDF0243C2E0A67209435911C18A96FF50E9006A57714C37702F388B681A1D62D32DDE526574B1D105E4EB31B31089CDC522026A5D874AE30D3775AF707903E70258D9D788D1DB95D482A8A47A9A24D7DDD8FC82841ED7E3A25975F86FDB0F3021D5F37635413E75F0E4500C94FB1B26C4719D4834354A07F8A98F2D04D2D663164C6272D5C5BCDF58D83A6FB1F86B6467C9AFD6C8944CF6AC51A58DB5835A6EEBACA31A847D1206F80F097E7E672DF52A43B1A70B6976CDE91F6957447FE4B21F5AC3C2FA757313FCC9A3FDAEE8FA0143F6751C393878D6AF979297B464CD0002EAF1C7FDF8EF6BE8780FA827C3CB95CD7E3DB2660DD53BF4155BF160F725C806491C7FE0233B8847022A5C01256C957C1A41A69BA4F9B58F5DA7DA7FB6B8D76E509F5C293F6E07A574343A1357569AD610DD3088859CAF483E641C04EBE1354141C4B13199DC2DE68726180862345AB8A18F1316AEF4C3D5E07E468E0A67E1EFAC023C30A7D37678C65863427B890244FD0DE658D5ED9B05A8E1D111492AE6AD5DF906268D8B2040C65153108FEE3039323A0EBCD89A63319 ct = 660FB1D85B4B64859C6CE3C893E1C2F98D258A63CD8BA8C3E3CC20DDCC12B6E376CB3991863C760D8A0D01FEFF6FDCB3EEE058035AB7EF5D322E60034EE960FD9E431582E6F97960CABE687A92676B100C7728FF7DA824E37FC8BBA6B42B6D99321E03D9F2B877254687DDB5665D5B8E6779F48642724BEC56CC89A50CC54D0D81391A206756F15C106993200C767FA8F72B0642D30D12601B670F5B0952FA8138FFCA54478C34DB31013AB90DF57CAD89553933FE7A37775012E4349D12EF8BFBB25D705F8678C90E794469EB78A08C4AADAF559D4DB6644FE85918551A68BCCF932E6D3FF1F8024A0DB3E64BF1C7A518D986820DFDFED6BFDCEF3EE6F9D6D3E78F73865C10BAB3220911B2FA53B33040BF572DC4D8858F870F9DFB5D9E6D8AC8390B40690A7DADF99E57B4B09183196D153C0232CD25021CE3E17C1741EA92AA0520C0D7237C585AF2FA650495CBD7B9F036AE05549B0F42C36DA0ECC56810E9B6DEF33B91F3B8A9CF9F675136D990BE5A792F8C0AAF6034B623A2098980C75F9D53DCFDAC2FFAD1933814BA2109E74B468CC450A07DFA942EA68D60E2F5B0B5E38A826F6CD2B228BFBC81B2E0E0ADF924AFDA54CC50853D83EADF63F055AC1A7CAA96D804ED3881E45ADD1A16EB94DB1BA694D1368D7DA55861A91661041EA7C83EE3D9D7D6C7F7914861913F688644FD587158854EC01E7548997C9E102B15CEBB3DADA4BA6F627FF926E37D12A260013E40D3407412FF21DEBF6094FD1C4D0032C75C48A537F44C8763183DD356E8606535323E2294E55F7CB1A59D57E5073E4FCD9DD0A233276D9A112D729BC469662AD4 ss = 466C6057E939E70CFFFDA8BFBF6F7CD1A0EF894923C5E09C count = 54 seed = A7C2C8EDB3601396BEB2DF0657EC82FD5780A2723581A9E03DEE1CDB018440439BB1142CAB0487C5D136E9AF46338AB7 pk = 5A12A92930AF9BB84531E06295C65BC86CF993689CF345642966FF736171ABBBE1F9587BCC5A0CBC231B5CA5B300569F2316A57043F59BBB6CB0ABCADD12713245B1AE45E19C401922CE016A2C04109D869FB97A0A016959EA9BE75D5317582BE0CA1E4EAC7684FB276162CB2CF62D3B1F529AEB8383D8D26A4A9DCFDE50F60BD71C705164FE013D37F2A5790B8E7311964895579DD34BA4B03ED3E1F8A2F0A5320EAFD6FA23A3495E107C1078AAA9F3560BE9DBE71FB451805F13439A5549885B3122B89DF0D92E0F468E924A9A0571B39B325EBCECE2DB6346BD9B8F06228DE3B6DDFEDAE46D19D7C3FB3165FBF0353717E1A3DACC0B5B06AE8593141BCD06D0FC22BF22D3F8909E4D05183457D053259882FFAFE0860E4800FCBE88124C59B242C5CD896E92ED01000F55EEBE9CC526529CF4FCEC46C7BD44F6EECAD4330F7F6114588344EC00D9EEF1F0510A8A1E96A80908867B6215C260A4D29DC35D69D26FB78C8B271348D009AD13D806BF376DF644192DCA3A01CF42DEDFFC0370F184FE9854D5E7185F4100443FFB5309C883EC8E70D03F79182019535C96BFA07829A627C94E8525632836724F426D1F7B09A06B57B6BFAFF3352110A713C82DA356896909D78A4B7D657FB8D1FA317AC5C6235ADB7A3E5A6FA016AF690823F0C7A7D2D447FB8120E6E597D0B41EE30C92D73C8002A67190683335C81B9231B84339EE0EA1021DA63B8E0AE43FFDC25E30124F2FBD0D7399115578E3F7E6B5B080D4272BCD1A1BFD585EF635406E29B4A792EAEE35 sk = 6C8C53ED6F65E6B2E324B84364E10DE42D1C26A106D4D1C99EEE79C78586FB55B9402BF02481CE4B27A52E87FEB92C4399C7F2988D40E942E7496AD15AD2AA8841AC9E53A84C4F6E854A8394306D42015A12A92930AF9BB84531E06295C65BC86CF993689CF345642966FF736171ABBBE1F9587BCC5A0CBC231B5CA5B300569F2316A57043F59BBB6CB0ABCADD12713245B1AE45E19C401922CE016A2C04109D869FB97A0A016959EA9BE75D5317582BE0CA1E4EAC7684FB276162CB2CF62D3B1F529AEB8383D8D26A4A9DCFDE50F60BD71C705164FE013D37F2A5790B8E7311964895579DD34BA4B03ED3E1F8A2F0A5320EAFD6FA23A3495E107C1078AAA9F3560BE9DBE71FB451805F13439A5549885B3122B89DF0D92E0F468E924A9A0571B39B325EBCECE2DB6346BD9B8F06228DE3B6DDFEDAE46D19D7C3FB3165FBF0353717E1A3DACC0B5B06AE8593141BCD06D0FC22BF22D3F8909E4D05183457D053259882FFAFE0860E4800FCBE88124C59B242C5CD896E92ED01000F55EEBE9CC526529CF4FCEC46C7BD44F6EECAD4330F7F6114588344EC00D9EEF1F0510A8A1E96A80908867B6215C260A4D29DC35D69D26FB78C8B271348D009AD13D806BF376DF644192DCA3A01CF42DEDFFC0370F184FE9854D5E7185F4100443FFB5309C883EC8E70D03F79182019535C96BFA07829A627C94E8525632836724F426D1F7B09A06B57B6BFAFF3352110A713C82DA356896909D78A4B7D657FB8D1FA317AC5C6235ADB7A3E5A6FA016AF690823F0C7A7D2D447FB8120E6E597D0B41EE30C92D73C8002A67190683335C81B9231B84339EE0EA1021DA63B8E0AE43FFDC25E30124F2FBD0D7399115578E3F7E6B5B080D4272BCD1A1BFD585EF635406E29B4A792EAEE35 ct = F8A20F2C804FCF31D68899D384CA8895F4D0276A090C28542C2B1B0F04836F6F02C2599660BFC182010458B8C0FB63D31ECBA156B349C37989BAC0E9BD98222CCA5168173ABB704A8F6FBDAB6A8E50898C12A0FC19F64B1FE504C33F4F4B4D2BA1B54147A6193E03B4FEB7B369D3C2815A2D8BA2C6219C1B07BABF58FDB976CDA85DAFA74D6C84442D685A44997D72D8482E2EEFE79C4436C5ABFBD9D8A0535D03EC7ED56147F89989A2A04FDE2961790872257A4EE9CAC24AB207348C2961B6792A4B14E7CB2703D8B6F818C3CA3845AC4B582C6F22906D7BBDC08923DBDB8784C850E4909D3204ED7809C7B888741A35995943776C439173DBC6E3BE6CB5E1BE30668011987482D609BF65A2026C62FD376488493E8094E355B5607F45430EFE10EB24133697DCDC0F95C458DEB8D328B376B73DD266E4B58A72F80B0A4792BA4FB2C3BB038E49967FAC4C4634D293A5B669224F4FB5FB0BBA7A9ACA01CC35D83D4728139F4BB8EE186B6800FAA389750CFA8F34A5FD35EB5B72B648675803972A3D429480BA688C0208A42758BD0F5D01E1D1FB74B9175E16190366A4392F0A75C36BCFA4790307373A7653408DA859AEE5CB974AE861AB0D4EE907647D9E388087DC87005E4FD37E5FC507684D0B2D7B05BD1F504F802EF9A33AFCBE190F77CBE92AADC46B4631410E58C8BC66E99B77E5CE43D0056D18DBBC92831E2879F50292D9790CD57B11B2C0BDE373FFE30D81EEFEAFE034977A3130CD458EE44917F064968AF2DD7419528321D2A8AAF0778E2635F4BD500E0FA9FBE62DB16ECBCF0B2695C7D00F392E30D0066CF70F3ED76FC95A ss = C27CE7412A33AAF035768CFEFDBEAD3FEE2D1BF252832288 count = 55 seed = 467F6158CB86B724039FF18C47950AE5C49170163C910FC9A9B30141F86E9C06EBCEC91497BCD156D95758C9F0C6EF91 pk = F8AC7A6A0B244941653282AF21A248C23730F04D5970545DDC45F5FCA9F065339861344F994118D665286056AA98356CADF016B67B177C7DF4765E3B173E5A69F78A389429B037A91572E8CA5AED88E57A6E9C053BFB8643997E626007223F57C6E4B0A3AA0F599BA98C4FBCCF7C35A80DC999216CBE08E91EA6E55B2341AD43681EF9D0DAB211F5959713E51D0DE9859983A34B0007728666CF86FD91D53F055DC3D033CE617E59790A68405361015457DD17C19CFDA3171D16446D38ABD6DF850D81A8916A98550DD386B24D8AB168FC0417CCEEAC93836B02912F0DFF500698472EE19D75204E672A766ECC5BABB92EB11D09968B769F4149596AEADE1678026031D028632231FF9ABEA46F819A542029F74CD2CD6590C81803F5343E6D6DB5D2983DA73CCA4F45F87EF5794593D19980449F3D947ABC7F27F457865F96BB25074E55C2C57F7D0FB2D9B406B11F2365264CCB785B0226CCA86B3853BB99FD23CE23CBB7C78B843B91677245083CB39137B12F3735C75C0E3B0B5D19B5508ACB6F9FF4BA89EB607C2B95266EE7AE8A6463EE7E6489BA90BBB2F6AD2DD31312CEC7A44571FEE86256CDCDB385C3B5046CF6D9D4867E8ED4E667C7D5D7C24856AAF27AA3A54CEDCF30ECB605F0803D876AB8D3CE283E621CEE71EC7C189E8F3183DCCB6F2DF701E509CF0BDF2C592FEED8417F89B8F4A466809C93E38E6F836CF7CCABE0398F86C45BCFD2C004977E48A76D57CF23C61EA6657EA66EEC168F8071A57EB345AD38A9823BF6AC628CA4FBCAE8DF6E sk = 2107204CD995F1DF14314D5381F8C5440F09A347502E161CFFC0A2EC3DCFBC7324C3DA70FE850E80AA818301D60C70F3038153866DCD5D179E22DB59B8991BB4F9E267712F97DA8BFE5A32BCAFDF9203F8AC7A6A0B244941653282AF21A248C23730F04D5970545DDC45F5FCA9F065339861344F994118D665286056AA98356CADF016B67B177C7DF4765E3B173E5A69F78A389429B037A91572E8CA5AED88E57A6E9C053BFB8643997E626007223F57C6E4B0A3AA0F599BA98C4FBCCF7C35A80DC999216CBE08E91EA6E55B2341AD43681EF9D0DAB211F5959713E51D0DE9859983A34B0007728666CF86FD91D53F055DC3D033CE617E59790A68405361015457DD17C19CFDA3171D16446D38ABD6DF850D81A8916A98550DD386B24D8AB168FC0417CCEEAC93836B02912F0DFF500698472EE19D75204E672A766ECC5BABB92EB11D09968B769F4149596AEADE1678026031D028632231FF9ABEA46F819A542029F74CD2CD6590C81803F5343E6D6DB5D2983DA73CCA4F45F87EF5794593D19980449F3D947ABC7F27F457865F96BB25074E55C2C57F7D0FB2D9B406B11F2365264CCB785B0226CCA86B3853BB99FD23CE23CBB7C78B843B91677245083CB39137B12F3735C75C0E3B0B5D19B5508ACB6F9FF4BA89EB607C2B95266EE7AE8A6463EE7E6489BA90BBB2F6AD2DD31312CEC7A44571FEE86256CDCDB385C3B5046CF6D9D4867E8ED4E667C7D5D7C24856AAF27AA3A54CEDCF30ECB605F0803D876AB8D3CE283E621CEE71EC7C189E8F3183DCCB6F2DF701E509CF0BDF2C592FEED8417F89B8F4A466809C93E38E6F836CF7CCABE0398F86C45BCFD2C004977E48A76D57CF23C61EA6657EA66EEC168F8071A57EB345AD38A9823BF6AC628CA4FBCAE8DF6E ct = 3956C3D17E9F764B8E229B237A0959484024EA3522EA79107DF92DBB4E7BB1A36534C24DFB545D95C340DE89F474C2EF5298B7367C7285D25261522012E02E49D6AA520D275FFEEFEC9B8875F25C605703F4B7A385190121D8236FFCFE1ECE3BCDF2B74CC01F5DFD96F974418CB783F9ADA3D4EC2E3D1302C01205EC9BFA6F402B59A7640905D309228F9FEA040B48BF41CBF3D9EDA095AB5D6366A40D8755C0D758602E6EFBF13EEAAFDDCB97663A75A7A1BAB77605AF67B8DE2242BF7FC6AEE58C2983043C9652C0FE3563D6A043FD421344B74726352387A23CF7A0BEBF424F64FB26AE8B67944A44A9EE1F583B314EF900435028BD461673F80A054E4AD0053CB0740B7F81CA8ACBB9A63F3EB4C62864348588189E1D240607449A64FCEE07B67FCCFD605C3F64DBA48C983D8273733290AD51005261010B6C8EB68D2620BDC3AAD1B09137ACD8281C76C263DBBFF305E7EBE08674996B12C5A12117FA05D6CB1564552ADF56F72964087F010B033D0785401DFC7A474B0A18B21888D15EC27541C6B57F6A7CC57D9D7C7210EECF63AA53E0DC0651700304FC9ADA99FD63FEB8985011B73D73257654E3053B1E875209E6ED7D812F32DEC66E5C9038FFA256F884BF417535C133A72376E2E8288B67FE74F2DF5031D73C1890627B7E847873FA312983AF8B252BFF082F66E94B153D5B7502D1FDDDC4521ADEE2D2505E59D0E7838F0A8F464C79048532B7AFC4EFEC26FC94CA9C0AECDB88106C2EC106027C9B6219175364C16971CB81650836FCCBC4ED2129B3DD5EF54DD8BF24AF7E094DC6ED3815DCEB7DC6310187B732E446E87F5CBE ss = 05F29FB6A3B72AABC5E50CC5BBC05BBB4BE16E71286993E6 count = 56 seed = 687C02DE1041ABAC7B2C1E6EC2A7C3375552ED5EDB10E3A8139C24CC76BDA44D719D8121A81D47A0B762B4E9EEB85235 pk = C61ADC08F3F0A2A8BF252B0307FEE17EFAC1A04ACDE74DB3C896A734710C33DF58C68598A64B3E57AA3223E2E957377DF4315242988F33EF36D5B7C2E572DDA2266CABA125C77F181E2F3C71F9234C3BF89E261BC41C82E98CA1605D285C587605ABDF5F68C7CE22A2319EC8768C0788A513C6440F5CC1A34BFEAE2013014BB9B2CF853CD506055C6832099FE1530BE5927FF68C3AC18926FE5E056BA9BFA3546DC7D170104BC03F94242A8DFDDBBEDFB7717D36B487406C8AE59F286483EB32AB2F13213BA18BCD542F333582D01EF53729436CB3B8912E5B17DB2A17915B670204982DFBDE7DA9D78D991A1AADF614B80804726288F8202FA0F8D0D7F9D647C53EAA9F4EC4326BAC7067ECBFB2BEBD9EF190D50AFA7D0C8A31DE1760F9EC52A131FBF0DE0D8C002F870010CA9B89F2027D8117091B4E4EF8C633AD690122841A52FD61DDEBBCB60E4B1A997D70F4FE541D2D8D1FC50D8EC3A55CE36C3469265C329864812305F12AC8E9F17BDAC1093D2B49E8476B9F5DAFDE0FAC8D69B4E1146F4F6615F7B821E98D5F0675F70E5EFE3CE8E097DECBE6C188ABECE819F6C60C3F3736EC48AD41A8204D3519FA84C19F76E49CB27160D532DDC9720CD917B834CB65A43B31ED6616766F7228CE5FB96B7E5177094FABAE3ED534D76D77EDE40F467B7A44B4D1E803AA26E522C65D6095465D48D6EF66A7A2FBE9FF22273BD1B9F7ADD24FC6E31E5CE2A22B58DDA8D01FEACF551AE02382A23F8BEB08C7FAD283A87268850396B21D3262FC8265759A596BC04A sk = 63A925685A8AC5BBD918FAA33AC397D1FFBCF99135D9DA7C3D6FF7AA4C50AF3D3AFDB8A246A56EE71465591831C371F2EB87467B0559DEDD776BA063EE6D2F93057CAD9DD9E0AEC1A30AE1A0635DF901C61ADC08F3F0A2A8BF252B0307FEE17EFAC1A04ACDE74DB3C896A734710C33DF58C68598A64B3E57AA3223E2E957377DF4315242988F33EF36D5B7C2E572DDA2266CABA125C77F181E2F3C71F9234C3BF89E261BC41C82E98CA1605D285C587605ABDF5F68C7CE22A2319EC8768C0788A513C6440F5CC1A34BFEAE2013014BB9B2CF853CD506055C6832099FE1530BE5927FF68C3AC18926FE5E056BA9BFA3546DC7D170104BC03F94242A8DFDDBBEDFB7717D36B487406C8AE59F286483EB32AB2F13213BA18BCD542F333582D01EF53729436CB3B8912E5B17DB2A17915B670204982DFBDE7DA9D78D991A1AADF614B80804726288F8202FA0F8D0D7F9D647C53EAA9F4EC4326BAC7067ECBFB2BEBD9EF190D50AFA7D0C8A31DE1760F9EC52A131FBF0DE0D8C002F870010CA9B89F2027D8117091B4E4EF8C633AD690122841A52FD61DDEBBCB60E4B1A997D70F4FE541D2D8D1FC50D8EC3A55CE36C3469265C329864812305F12AC8E9F17BDAC1093D2B49E8476B9F5DAFDE0FAC8D69B4E1146F4F6615F7B821E98D5F0675F70E5EFE3CE8E097DECBE6C188ABECE819F6C60C3F3736EC48AD41A8204D3519FA84C19F76E49CB27160D532DDC9720CD917B834CB65A43B31ED6616766F7228CE5FB96B7E5177094FABAE3ED534D76D77EDE40F467B7A44B4D1E803AA26E522C65D6095465D48D6EF66A7A2FBE9FF22273BD1B9F7ADD24FC6E31E5CE2A22B58DDA8D01FEACF551AE02382A23F8BEB08C7FAD283A87268850396B21D3262FC8265759A596BC04A ct = 6E3915BDF2576ADDF03B19C741BE8E802FBC1E27E42634576423D358DCA3791344E4A2E15D79DF70B5C36E06B467AED58B6CAAA4179D961F028559A0E1284D232CD99C3B1483DEE80B69217A97927FA04A2FD9098339B2AAC312B40B8401C477FE384C6A70425884FEE001B23B8E6602C1784044E166DD5C9031549BE48606E1DE13B65DA104A343BE68A6D6EDE9B9EB4C8DA0B8E30BF7EDEE338CFB9AA3ADC4450F5514F8BC33381671691A4125184F32A7AFD5F3E6BBCA2E6CA442286698B1864D15EDE953EF0BEFC40CBE2ED6862B146D22CC23928CBDB48779A9B01C0B482D5CEF7EFC7871E67F6A61D2C4CE537CFC1E1734514F39F39F9FA46428C3352590D0D95A39BC0A292A53FB976BAB479137B1F414C24E7A7F2F3DBC4D3E2A58F664C8028DA34911A2971564B2C1CEDC7E3F049C70C7A49374B2A78AA9C2D5C4025BA71C79BB66978E2C075EFCBF53D6B39EFC82B9CA95A12A7F25FF2147FAD64A37667036A6C03F793101E6E5740BF801DEC444C7E088CD4B1C63FC8313D7F0ACC4685B2E20EDE515C4947F675BF32FD6AAA266CFEADB8AE416162EA60B8EAC868D71A4140866AA646E64F2219F025E48F23CED11609B0EE7B2E9984766712C26A64C2AE49A03F7C668E543F3F8CED8293138C3C17B15FF94FA90DC0B97B90C1AB5E40A4838ACD70D492D2ED3FE2D04EDE661155DB93A409C91B340FDCCCAFA5D0FE75269B965DDF2F8E2BA7ACC7374330EE027FF63D7C9800BC54ADC700C2CF7B187DC200E9BB69942061C2C4B5012F52D405D1865D55A1663E6A8A5409A5F6F33391B996B824A423C597F6A65B36AD08C317DCC ss = D83DE2B0FD815F242B35A514D308C65081E65DE68D7FD5B6 count = 57 seed = 4142237070C216BCBE245A39BD9220533C97651D84832B26727855AD994A0760C52B9319AD404693E4248B8C5FF324B3 pk = 3B93C150CEEC75DC6AAF7332531B59BB09C13ACD75F4DE1B7314F63131EDAB0E558F711A761CCC5F57F030278F95A0BC153F1F35507AB818058789C1EBE6E216600576467B24B3C005B48804B4BA2CBC3365CC67249C5AB07F2F1283D26E641ECC504288325B426430810C470B1F883D22C0AC350D14B36FB3AED43740EA8B0449BE023D90C246D9FB3458495D2D8501F4E828CE555C938EB4F8A3034A0E960ECE5A7D5C6C7F1367398D85FC8072F42EFDBF5CFE57A554CC12AA302B1C0B3A858711A31FBF3375132F5E42BC803074C7F8D68C9A45195B7315C25ECA1CE8ACBCC1A0F8AC32B8BD4A114F10235D9F512DCC948FA3CCF5AFC7DBEF74C02A567ABF7CD7DBA8307CDE6D94584C1E550A1143D8EDDE2070ADB9EC5536EAAFB1582B26CBD8E862AEBDDBF1FBF7C88176E731B289228D0BDF87E545D0E13EC06BD05E2D799E347A9809A65E214BB988301996389EEC1D4D0C750D1A71F19EBBDEDA852F6ABC969EC540F1FC6BF2E489AD4F921427DA212C15E1D206E9199510582B494EE78EC02F5A174330F0DF6DFCD371565F0B0D5DC9C7D4F289D03325AC9C5C8CB0AF63851E09AFCF4A9763889153BBF01D58030552FF1AD79A80B2243E4C913043DD76588EB8E0E911BF81BB467C9F397CE13F83FA756239E56370467D51BC39DC888EEFC9004E5F8C96878F034B32233758C2B5F87DEDCD4358358F4675CA113B3CAF1670946C85C285AFBE93E79B2EDCFA997D599C0966EF7475BF23311949F742B1C667FD97C4A8C842A1255AC611D76B611844 sk = 6A1AEE5E708C1B47F02BDACCE4F56C860F74FC7CFEC1EF3B58285B1C8AD7FEC2230E05B7114FF0395CC6634DB1EAE8258072D09C09F291E92D6620B177DC50D7B992373F9086C7AFDBF4B44A96BBA8023B93C150CEEC75DC6AAF7332531B59BB09C13ACD75F4DE1B7314F63131EDAB0E558F711A761CCC5F57F030278F95A0BC153F1F35507AB818058789C1EBE6E216600576467B24B3C005B48804B4BA2CBC3365CC67249C5AB07F2F1283D26E641ECC504288325B426430810C470B1F883D22C0AC350D14B36FB3AED43740EA8B0449BE023D90C246D9FB3458495D2D8501F4E828CE555C938EB4F8A3034A0E960ECE5A7D5C6C7F1367398D85FC8072F42EFDBF5CFE57A554CC12AA302B1C0B3A858711A31FBF3375132F5E42BC803074C7F8D68C9A45195B7315C25ECA1CE8ACBCC1A0F8AC32B8BD4A114F10235D9F512DCC948FA3CCF5AFC7DBEF74C02A567ABF7CD7DBA8307CDE6D94584C1E550A1143D8EDDE2070ADB9EC5536EAAFB1582B26CBD8E862AEBDDBF1FBF7C88176E731B289228D0BDF87E545D0E13EC06BD05E2D799E347A9809A65E214BB988301996389EEC1D4D0C750D1A71F19EBBDEDA852F6ABC969EC540F1FC6BF2E489AD4F921427DA212C15E1D206E9199510582B494EE78EC02F5A174330F0DF6DFCD371565F0B0D5DC9C7D4F289D03325AC9C5C8CB0AF63851E09AFCF4A9763889153BBF01D58030552FF1AD79A80B2243E4C913043DD76588EB8E0E911BF81BB467C9F397CE13F83FA756239E56370467D51BC39DC888EEFC9004E5F8C96878F034B32233758C2B5F87DEDCD4358358F4675CA113B3CAF1670946C85C285AFBE93E79B2EDCFA997D599C0966EF7475BF23311949F742B1C667FD97C4A8C842A1255AC611D76B611844 ct = 3B8B820F139C99678D1B7A1D6CFDA81168F914C9205BC971A8297A2D83DE5E7CE9D129C91F09FE301D38A5BC13A40F42129750EDD114B47175E94222C30C72DFC9D1B8E5C70AD736FDACCA8928ADAB42FF6F96EEB9AFD15DBC06625B88479E72B7BAD61EF802ED1AE568F2092D5B0425DD0C7CA3BFBB8676FF299B581D7C889EAD1224FD22FA436339D71E4685C3C38062E7417B8A6E745B3CB89A936CC0652999F50242B569BE678DB043EB9ABA65CDB582D6E841FB2E15FB4269575047A69A738B8399197FB6B69083C727D2A86BA931C4543001693A5AD61DACF8B17651879D6F813B953C14777A2799205E4AEC408F99E52C7999EF5670FE493C71197AF3B8C90D69A2334FE333665911A1C9AD50144355EC60903930FB573B811BCB37BA796D15BFC8CA6F383ED9A09715AC6AA045C38AC6620BF2F12EC9B00DA65FF66A27040E1A3E1822898855B0EF9BF2DD9782CA0381D4084B5FA08CCAFC19AFA9DFFC21862EF323936E9D4F3D47A2056D68A73500AB671F756894144864905B7236FA1284BCB3D3F536DA41268546AFC5CEC9C24BBDF3195E55CBB54C7CD0F7B35F7262B7066715EAD42DED38DDCEC76BCE273E13F57A73AEEF8D21E8105586E791F3CAA0FD05E6CB6B3AE8FD5FEF67D3816D65AF0EDF20476DC04917755170FDBD61E9C2ECC9CE6C7B287D5A01C9143535440920E7004D685F292209B047F81B52AEA2189775F4F5C40B555EB2453D66A7D281A8D882343335A45F8096A89693EFB54A675A1F757B4635C60832D110625C9F6F955C3C5A6306835DD68407F162DFDEE3AF6331F1B13A2B3A9A5718FF7289CCD6BBAA ss = 3102DBC7FCB6CE73FC711F0493A26DFDFD44B3D63E871D73 count = 58 seed = BD334D7B7EB14E00E68863F2E5551A095F8AF10681C28353FD19B9A7E70B8BFE266840860609008A567ABC66316C77CE pk = 73C97A72EE619708D10F429E79208249870B983EB4481896A56E988D96C49821AE1345A1A56D301C7AAADFB011C33A69E2444B0338574C141B076A9AE5E8D91B5DE0F0A76A7BFF42237C2D93A68C78DF65EA19096E60F5D418D98BF3974C440107874695D43E32E3C2CA92EC09BFA01F2270B31393564B275A8D8B7C23C7A2C6E87B57B79E0B50E4FFEB9F9830C3BAACB422D6C8CE13DAA08C0FA4CA2A5E35960F8B94DE2D5D0D8023E47D9E01F55FC1703452421FF12DA0435CBF215D2C188C2B0A36E38D71CA8FA9E6E9F0CF882E0992269728874B441FB0636AFDDA7FF301C9875FFBCA04AB9C6E3D22A12EBD54D4E55944260AF1BD9FCF52AA1FE56DEB96143978C3A341C663F3A3D91D9C547EF9A4110DC0C6299C372D283E9DC08F9A49048A69CF5DB5D9702DAA9D1AF97F8D42BBA45700C660567980FE3AEB71B076D43808A83714CBDFB52D5251400E3332B69F846883902101AFF8B823DAEF50B94846C2FDDAC6769D55B3E4CF1514D33007342EABDAC2203F40BEEA5DF44C3D108634CCAE48DCC58393BEE7321BA1390C67945C248D2264B23958409B47E339DDA449D871A8FD8DA2505D70D3AC51B4A39A439ADF5A947DAE7264C6EEF3846D001D3AE26D54C3A0D9C4182862A4324115533C10F30F642FE59A23FE2BF3E014D06D066CF1A11F4EFB86756B5C9205973F1135845D56454B7A3A012BDDC9A953EF144C10F08BC5AA6BADB22DD3B5EF55A76DD8B76136C0A1E3B1A5DE89EAA228461258D0F4C40481233ED1645A480C9A46E169131D11 sk = 6396B328B100E4C7F4BCAE69875EDEA1A1982421558C608C13C592BF7B5D0FEF1100CED48ADD211A5C937B8D6079D8E271AF3F949EDC61F70E60453AEF20DEA99D44DCF0E06FE406A8484BD3CDF0240173C97A72EE619708D10F429E79208249870B983EB4481896A56E988D96C49821AE1345A1A56D301C7AAADFB011C33A69E2444B0338574C141B076A9AE5E8D91B5DE0F0A76A7BFF42237C2D93A68C78DF65EA19096E60F5D418D98BF3974C440107874695D43E32E3C2CA92EC09BFA01F2270B31393564B275A8D8B7C23C7A2C6E87B57B79E0B50E4FFEB9F9830C3BAACB422D6C8CE13DAA08C0FA4CA2A5E35960F8B94DE2D5D0D8023E47D9E01F55FC1703452421FF12DA0435CBF215D2C188C2B0A36E38D71CA8FA9E6E9F0CF882E0992269728874B441FB0636AFDDA7FF301C9875FFBCA04AB9C6E3D22A12EBD54D4E55944260AF1BD9FCF52AA1FE56DEB96143978C3A341C663F3A3D91D9C547EF9A4110DC0C6299C372D283E9DC08F9A49048A69CF5DB5D9702DAA9D1AF97F8D42BBA45700C660567980FE3AEB71B076D43808A83714CBDFB52D5251400E3332B69F846883902101AFF8B823DAEF50B94846C2FDDAC6769D55B3E4CF1514D33007342EABDAC2203F40BEEA5DF44C3D108634CCAE48DCC58393BEE7321BA1390C67945C248D2264B23958409B47E339DDA449D871A8FD8DA2505D70D3AC51B4A39A439ADF5A947DAE7264C6EEF3846D001D3AE26D54C3A0D9C4182862A4324115533C10F30F642FE59A23FE2BF3E014D06D066CF1A11F4EFB86756B5C9205973F1135845D56454B7A3A012BDDC9A953EF144C10F08BC5AA6BADB22DD3B5EF55A76DD8B76136C0A1E3B1A5DE89EAA228461258D0F4C40481233ED1645A480C9A46E169131D11 ct = 58656AFEC3D50F0EC1FCD1ED3DFA03E339B0AB8049EAE0083A46DFDD27B1A042CD0C75BEB152FBD5CEF874DD8113FF46C3E753767CB9B4C445FB1A8D7B782BA7CBBE6B9C1663D5DA956CF96FE1A54E8E4551D37932A17C0C4BA94BFFD72FBDA032E5F773CCEF9F5F77E43CD0810EC99A344CC9DEF3FD10D2B876DE02AF2FC414B93987EB97809DF1DA982C900C0F25D6C1BB94027E86E9DDFD9B2D62B250BB5724A2343C2D8FBB221024F1C5FFC07542A070B9B0757F12DDB811236928DB886ED7386F5A7F22D0252DA44A5810477CB5F3D050A0BBC806464F1BCD34DCFE6892B9CC84276898F7303E3344FF202E7C7CA386517A67212AFA238B9D170353BE40C0B7E3C234D8842F4C698DA01EF022167060D4DE7FD3674E19678E5AE61CC42C6D85EDF768911D024F379886E2C7EBB796579B5E8E9C53944EAE3EF587B667BE72A0B52FEB520858EBCDAFBEDEEE8089CFEAB0338B9EB68FF302619EB14B89DA52C2D04429B2040E8A4E29BE27FF41221A0241E532864166026417B69CEC9D81BDAFCA450AAB98C65D39B406F5B9947EA7A1EB9A9FE617AC46AC673D08CCA599172CBBD0DFDB200D6EE422BA00E11F08AE1343CD9A2ACED2F89D436065FDA5E9CD6F6FB865B1856E283E690D9705917EEB000371FD0607FD89FC2F95EE55B421C3EB81486915D91F06299FB88807CD7E8FB3F29A03BACD81A1303252B6CC6D02638E6BBEEA8F3C4D5444000B972EC321563C5F6B5EF521CC96EFA783C610B51541F5DB07B1F9A50DBC67DFE641F622A19793F24669BD02C9471BF0DEBA052005D698145E529B4751AB9DCCE15E6636BAE06A87E7 ss = 30337E8CDF34EE191ACA66DF825C1DF63849F25ED19E179B count = 59 seed = A0264C58AB1F2CBCB212077FD378D340307ACCB31F1312137CF84E3D3135044D4EAE8BD38BC3E540A0C14D46458F6179 pk = 26FB1E827C91419DD4992B30D8D8DB28EA7C2F63EC31147159A29951AA174459D66E924D2426293B6F9722154E6EEC3D269B41F7D5AB5AB96D82042711A9D7FB2A777D0CCDE7EEB3C0E97C8EC723C2552CBA0CC81F3572A5F3C1E44D6B4BC230D34B8CE0D82E3E6A3019EDAD0F48ADA36F319682AAC255612260F89170538DF8F6A08476D944BDA4966850F4E7639E782C19B84DAC68F1702A6EE078CE1815FC492C90D09D825F6AFBC1AC1F40A2F3923A5CD321DED0AA8FB2201C519081585F1E098D1E4E49B4466656B77C44BBB9C3F948CE9DE220486EBE306211294F46B506FC16CB2EBCC9BA70C2ADF43FDE6EDBF1BEFBAFF2C9809D226F419BBD84776AA514A3D4193DBB3E306A10B03576661D0CC0D7E882B4BFA5371F366490071D2B7F489BDBC2204AF539ABD0696CF3D024997831D8E3FB948399D2068E0F862C562C88145155A9114254BF567F19AF0312D4659AE37779963C608EEE1CC3F278F5131CC229F9E7B0D7B106086F87D0B6089DF514EA523B0C1191F431EA62132BAC743F58FD584ADEBD3D1BA5C48D7222E0F510A3510004A78BD975B2F7CFC922EECF4BA203EC1E94EA2777EEBE39488DF31BC5DFB2F9444924198D44FE00B8CAA4749C8F70275FE61B4603D1AB44CE979AD678FF675A1A21DB1579757DD5928C7D77D8152A27BABC08C2DD98E5AA44C492ADC55806AF17A5B44E9C0876E1E7C7DB6C6D6F8DF2278E0A9B1FD413A412DC55D214FCE7C3829674E58A5EB5A9D453451620ECDAE5D0523CB8C9A34A5EC4CFCA491A2666 sk = A453BCACDD2B0D4646009E5ED451C3C45F08FB827EF733DB3C517A9DC1AF93E67A3CC8AA3239D4C52CE4C95AFDEFF6EFBFACAC10D294EDC0E7CF4535059BFDBABFF7698FF728119CEFE3FA1A6BB2F80026FB1E827C91419DD4992B30D8D8DB28EA7C2F63EC31147159A29951AA174459D66E924D2426293B6F9722154E6EEC3D269B41F7D5AB5AB96D82042711A9D7FB2A777D0CCDE7EEB3C0E97C8EC723C2552CBA0CC81F3572A5F3C1E44D6B4BC230D34B8CE0D82E3E6A3019EDAD0F48ADA36F319682AAC255612260F89170538DF8F6A08476D944BDA4966850F4E7639E782C19B84DAC68F1702A6EE078CE1815FC492C90D09D825F6AFBC1AC1F40A2F3923A5CD321DED0AA8FB2201C519081585F1E098D1E4E49B4466656B77C44BBB9C3F948CE9DE220486EBE306211294F46B506FC16CB2EBCC9BA70C2ADF43FDE6EDBF1BEFBAFF2C9809D226F419BBD84776AA514A3D4193DBB3E306A10B03576661D0CC0D7E882B4BFA5371F366490071D2B7F489BDBC2204AF539ABD0696CF3D024997831D8E3FB948399D2068E0F862C562C88145155A9114254BF567F19AF0312D4659AE37779963C608EEE1CC3F278F5131CC229F9E7B0D7B106086F87D0B6089DF514EA523B0C1191F431EA62132BAC743F58FD584ADEBD3D1BA5C48D7222E0F510A3510004A78BD975B2F7CFC922EECF4BA203EC1E94EA2777EEBE39488DF31BC5DFB2F9444924198D44FE00B8CAA4749C8F70275FE61B4603D1AB44CE979AD678FF675A1A21DB1579757DD5928C7D77D8152A27BABC08C2DD98E5AA44C492ADC55806AF17A5B44E9C0876E1E7C7DB6C6D6F8DF2278E0A9B1FD413A412DC55D214FCE7C3829674E58A5EB5A9D453451620ECDAE5D0523CB8C9A34A5EC4CFCA491A2666 ct = 58D51DA9B68F30085AB616D4C2A74E2A5741FED676E589BED9E60229C42F82B5E8B51CD8858D87886A94415CC1CFBB77858E5785EFFEB8B7973B60F9FEAA98990C1A790CE876473BE2FF8B9DC93B8C5847F406F2BE88CCAB22195131D53B7F0AA0777490B170BA8448B16003D6F212C4E71E71DD98BA6E3A0D22936FE473A2A779F9924E2F3B68100891EBE6ADBAEB1753761EA2D76D7ECEEA76851A43A7DABE767ADCD5336B5E200E48801F7DA1A74560A6BEFDF4C36C2416D1BB0E4FAAD2B884521A1AEE4EA6402607E2652FBA6CC37303F50F0BF225BB89C724A387140696FEA3FD3BD90440F4496EF8FB21BFC507CC6F3461E2D6C806EF0ED49A3C9748FE29E4117BFAF982CADD597C0D92FDE5A16491289270F15994A012AE4DA6194C6F48BDC86913FAEC4D2601ACC707C14333A585D8742C4135DDF390337F8B6DF45094E9A1562AAD342DFA05CA05134934F2E3B113E9ADBB6931FD1B855F631D88D9477187F975B23424C40D456E78EDFB6C61014E4445A4715688AF645107DAE6664D1E6F2A442BBF27D3C4F8F990C3784719BDC3507B545D28EFC83EC0157859F81E2990163BEAD6DE95C36C8FFBA941101B0F2A6E3C0B39B7AEACDCE25DDDB2BCFA329EB7950E593CA5B4766CFCF78C92F774C224A54FF3BF22B3BE4ABE5704992800BDDF39DB5FB0CA4E5BF1AE79860D4F63F98A9C80F64C6D9ACEFFFF0F513FCCE1776E17E3410359D4A76FED7C8F93A4D87877CDAEE4EB0A668358CDFCFCA7D5013E16E27A4F74A73EA0BC780237C1B73C8B47E95565EF22CF1BCCCD38B906B2F3ABE407333B35021AA627660546C36B8EBC1A ss = 66C6CC59647EB6139FFCF4FA6C904396FC56B3C6F28AE487 count = 60 seed = 99A9CDBFC674AB3FF2C64CDED7D697A6E27A767434A47AFF7C3FBF3C6A22D6043D27868955286A13EFE3DE36D22EC48E pk = DB48E11DCC6B6C48AF7FCC13F8A1E0DA6A2A071B2F2FF042FE2F081F4FD90C9F80B6B69858644A73C9BAAC1127FE4F1836267C94ED10F45D56C2A2B35EB2F00A99E7E5B5CF38130165CF1FD796605F9507E0F7AB13E4DD56EF9C46DBE306CCD423E6A367CAA980DF51CE0F1F0787ADC7F330CC0D3B98FC083F591FC570A9C415CD26C8A7F53ECF1D936EBD54839A948A7CAE2DB9A15C47DD437C33D881CF382EF716B2EC47815D57D22839A51ED8D115AEF267062D4E3F0C9579BC17F5F809DFFBE2198F20FD119AD93E748A3681C4CA76D7FE0C4C7AF5BC6307A8F060B96EB55D18DC3E56D5FADAA879CEF4F44C774B33F3F6110506B58254DC0F419896A8224971B1F6033B57A2FB027C7672C6E3275C9404A9CABA79EC34493023409AC9E055DD7112A182E27FEA26E568A2C64957A917E977680DF6F5E850D2DE8C8CDA77B76777674479A530446BE395D91D72A50246A8E9DE6B02904401B68CBB7DD96FAE8BAACD35D896501D5252FA4A31727E05EAEF6349C9614044C67E2FD810863A89CF31871696E37B80A2082A2DDF23BC0ACA0BC8453BB2FB6970064798FFC3178125EF301D248B1F2EE6CE3DB2C34E21BBCD39091816014DD88C9DEC50AFE22482AC66207AC082E6227B9F775B0AEEBE90E90E1EB53FE223A547065835FFEADD11641F225E5B460816AEA770FFC0098EC93D5D15BEC31567220AA7EE43F20DF1BBFF85AC56E4D64F84B1A092B1247368E1F4BC2E833CE5D2D9381623A5CBA2456A2F474851A982AE37082AD616D9F5D13A80B662 sk = 47CA2B77C5B717F423222C2730CA5CB9C856BC951D01B2B2C80BD76CCB5539B78F1481D7CAB000E33FA07DE8DC9627A85E76FABB4428A3376E66300CF12A07870991F8D8905ED1F967B747102EDA9802DB48E11DCC6B6C48AF7FCC13F8A1E0DA6A2A071B2F2FF042FE2F081F4FD90C9F80B6B69858644A73C9BAAC1127FE4F1836267C94ED10F45D56C2A2B35EB2F00A99E7E5B5CF38130165CF1FD796605F9507E0F7AB13E4DD56EF9C46DBE306CCD423E6A367CAA980DF51CE0F1F0787ADC7F330CC0D3B98FC083F591FC570A9C415CD26C8A7F53ECF1D936EBD54839A948A7CAE2DB9A15C47DD437C33D881CF382EF716B2EC47815D57D22839A51ED8D115AEF267062D4E3F0C9579BC17F5F809DFFBE2198F20FD119AD93E748A3681C4CA76D7FE0C4C7AF5BC6307A8F060B96EB55D18DC3E56D5FADAA879CEF4F44C774B33F3F6110506B58254DC0F419896A8224971B1F6033B57A2FB027C7672C6E3275C9404A9CABA79EC34493023409AC9E055DD7112A182E27FEA26E568A2C64957A917E977680DF6F5E850D2DE8C8CDA77B76777674479A530446BE395D91D72A50246A8E9DE6B02904401B68CBB7DD96FAE8BAACD35D896501D5252FA4A31727E05EAEF6349C9614044C67E2FD810863A89CF31871696E37B80A2082A2DDF23BC0ACA0BC8453BB2FB6970064798FFC3178125EF301D248B1F2EE6CE3DB2C34E21BBCD39091816014DD88C9DEC50AFE22482AC66207AC082E6227B9F775B0AEEBE90E90E1EB53FE223A547065835FFEADD11641F225E5B460816AEA770FFC0098EC93D5D15BEC31567220AA7EE43F20DF1BBFF85AC56E4D64F84B1A092B1247368E1F4BC2E833CE5D2D9381623A5CBA2456A2F474851A982AE37082AD616D9F5D13A80B662 ct = F654177012CF438B93CCC0BD485D44B8E500B6A5D3EE214FE81919BFB34A7D1B1940BFF33EDD10E50B860984E3992AB9ACF1A4680B683126ED76EB01D61DAE36CD74228004DA981A11DA233B4C009875CEBFA9C6C0D2EA92047E242591342CAAE9CB17F458CB5EA64AD3BA34FF00895C8FC7FA7F4ADB6D09E38183972BB557190C6FB0A3EDB215C810DCFB2E3AE3162A0963F9D31EA84CC866555D2D36FEFB6DEE152434958A74FCE1B552CF36A1B3ED86BDEDB4B8322ED3585E724F663B7A82799EB5B8D58B0751ACC3DE0F47AE1DB0992D401E05B4772FD6DD558062BCB03A0AF0F1CD008AC95B19AED50D3CA8A6B99CB7C70EC6E5F0C6D9687116876774D1317C89673F9AD3F5953FBF99E68312B9DDA23880019F07D5906C68066E78DE13D7E6F3A585E6FC4E06EA8066EA551C2404EEE8EFD048AC4772EC80D47FF07D2292DF1D2C45279265B07BC9743328C57C7775A2C9AAE3E6C79BBCFA642C974D5CC12692CCF01E32FFE87A804A03CCA84B628E8B1CB9B3984925EDB310CF6EA13DFDEDAF47BFA4510640131CDE926A2BA14FE061602276E105456133B9ECC29EAB66A0FC052909123DF4CC4799D88A7AC79BB754FE06ED36BA3E08A8876961D15CB1A0B02360729CC7C9FBA71A6F77B86BB0A72BD6B94B825ABDE8D62C92D54AD2C70A40BD90295A3A7AF18C987EDC2AD81A6AE551F2C7AEE6523ECC0C9E5A3C92271E2486385991B79A79B062D9494E4BBB565731585876C0AC74B71B14AA2AC7B1845976FEEE78E13B9933BE73FA872AF935655FF1685DE6FE54BF257263E47E87F02F3081BBB903593411B9AB49A57C9D386288 ss = 7019023E74B19711EDCD06D52200227419C8D1A137B4A697 count = 61 seed = C799D57B41F28C5C446DFC58A5AC6499C4BCF3C162AFD2B09A16549826EC2A6F689E44BAFC4ACC82F5D6AEC23F4A3993 pk = A74BFB44F0434F0965A88CA9F3375F57DE619A4768780DDCDF51E29D9BC5C859158D44C44B74FF547C7A2E03C2C26FEC6FE8029B5FAB2F35F955E4D6FFE5BAEAE81CD39EC544769080970DF88000E2FE21B08942A72AD5F31469897FC416CEF6CD341D56A6D879F89D90CC50DE2EB9407ABCD7DC21AD216374E24B038FFE7FF8A2A27CB75627049226F5A77E9A4FEF41931423E2D0F9FB7A13DDB37A5CE07081E0B9172D2E02A8566BAE08E2A92D3703BFEA8C87B44E190B75252E0E909E2FAC082B020E0AA7329E47287B4EC2793C9DA52AAB4824083210BC69DE33C248CD0EA5EB2F8078A21EF9893D7F8DB4BE1CC157415FAA5849C4EB139DFABB49160873DFAA74F2F8161AADDFAFCDD2EBFC2649C7F1F5DC33EA6544311BE139BD31A3CCD0A7814F089C53173BDD9AC1843388C572A0AF4EEDE7AD37AB3262B8C48F0B4D9AF436C818FE2F6A4605AAD4BD3A7CA8549B92B0179715AFE51A76513397E355707EB1A6B9CFC334DA4D4B260461D87DBDA4509888BDD95BEEDD9068D14F2D11D13E5707114CF5EAACD1103D9F4BE72AEFB788B2EB1F5A1EF562AE3BEC3627BCF210829AC23A942FE1C64DCDB2F0E4D29C2C5AF479D3F38642E2AD647799555FE04C59220113FA5E3AE4179708C3C1BEF1D2DBD23A0714348FBDC2E4A9B554257C9A99228175ED2D9C11EA2EFCE541EC0338C98068177DBE52EEB6626FF22E3269A3A009D4CF995B2D25B2FE8D05CF19217FBA09EAF5C4F73637BB39449133180E64A22F93A420E9974534B80BFE02B3DDBDF639 sk = AAF6EB40E596A5E3E8218871E708B089240DCBE7FD3641F0E5E41E071CE49107E2F8D320AC3CB0C52EFDC753282F092BC39BAF4A18783A48EA031A191865EB7885D03687DE2B06E1A480949CC3D98600A74BFB44F0434F0965A88CA9F3375F57DE619A4768780DDCDF51E29D9BC5C859158D44C44B74FF547C7A2E03C2C26FEC6FE8029B5FAB2F35F955E4D6FFE5BAEAE81CD39EC544769080970DF88000E2FE21B08942A72AD5F31469897FC416CEF6CD341D56A6D879F89D90CC50DE2EB9407ABCD7DC21AD216374E24B038FFE7FF8A2A27CB75627049226F5A77E9A4FEF41931423E2D0F9FB7A13DDB37A5CE07081E0B9172D2E02A8566BAE08E2A92D3703BFEA8C87B44E190B75252E0E909E2FAC082B020E0AA7329E47287B4EC2793C9DA52AAB4824083210BC69DE33C248CD0EA5EB2F8078A21EF9893D7F8DB4BE1CC157415FAA5849C4EB139DFABB49160873DFAA74F2F8161AADDFAFCDD2EBFC2649C7F1F5DC33EA6544311BE139BD31A3CCD0A7814F089C53173BDD9AC1843388C572A0AF4EEDE7AD37AB3262B8C48F0B4D9AF436C818FE2F6A4605AAD4BD3A7CA8549B92B0179715AFE51A76513397E355707EB1A6B9CFC334DA4D4B260461D87DBDA4509888BDD95BEEDD9068D14F2D11D13E5707114CF5EAACD1103D9F4BE72AEFB788B2EB1F5A1EF562AE3BEC3627BCF210829AC23A942FE1C64DCDB2F0E4D29C2C5AF479D3F38642E2AD647799555FE04C59220113FA5E3AE4179708C3C1BEF1D2DBD23A0714348FBDC2E4A9B554257C9A99228175ED2D9C11EA2EFCE541EC0338C98068177DBE52EEB6626FF22E3269A3A009D4CF995B2D25B2FE8D05CF19217FBA09EAF5C4F73637BB39449133180E64A22F93A420E9974534B80BFE02B3DDBDF639 ct = 4667C47F5544E2BA203D04342213D140038B63367EB08FD23CC8044EBBFC9072482BE50D07F1423B7FD20F2CDE0050002B7E0D2BCCDE25DCEA4B97094E2F98974350CC30B645A32975E1B3BF2403FFCB11627D7B86904BFD3E14E61F3065901B04752CE420038EE464870BB15820499F4B8C2F8C6E8F68166CB70754DD20DEC9BD6ED612BBA87DB18D4451FB078AD230EF074A64BE64680C29D15EF3B9EE7DBC0D500CD356ABB79B089E6324AD04A4930C9C4705970896C6F9E65C2FAB2F44CF22368F44D096B5418D045AFA08AC1A3C525A328F3354022BDBE9CFBED532C0378C9E40A51FEE8F992EC211CEA1BED8C4EB0DE0A58E56B7D60D02D3D3E6CFE19948892A7870D372725083A874FAA5781EEF643245B694AD3C274B8D7751770886E2F514D17B50F7866CE5F7D7CCFCF45DB448555A58805948BB9D93301B3BAF103EBBFAF2EAF0EAF5BFF16937FF534D59532996944E9E27D01E29A4B22495C5B23803E8544719AAEF545619B6BB5DFA3C55CDC89175636E66BEF772A15D5A8A587C186F664F3BF6CC2BEB78C2B7CD2262BDFAE1026625E5891FB1C0D465800593EE9CA9D6CFA3EA0D5971740D8D4FB90AB297C357D574BFD70C32DF5B9696377251443544A646124E9EE661DB2C58810D0C0CF6367E50CCF7D19D8F9B1061172F9A8582401E97D1B88ABE4EDBD5B9A1C0FF20A7909E7FAC53ACB8951FD985904141456127C6BFE11E5717EC587CF90158DD64B73499C6B961F32127599CC1357D2C486AE73D484A885465638AC2B141BF5C669161EE548F060EFCD273CDEC0675AC192F98C2E4AD061CB5E8F21ACDC6599039ECAE ss = 6B73EBEBEF3DCDE86005FA30124061038FA676EA338667D8 count = 62 seed = F7AE036A0176A9DE9A036A542DD2840033277C44AE936D10B768566216DE9D4395CD42B116873B69D9804BA6CCBC05D5 pk = 27D3FB38DCCBD9E61A5F5A7D70A54A2524D1A2D78460EC9F56AB75B10D34A7D4C0CFAA384F1D6AF0CF75858E65B209FE81F435D3852EB820AC7F5213D3D024DE3E6273AAB9B06F0F24E37155F45F373D722BCE7912FE9E0DE98994FBBA6AF072E2DE886DC9ACDA864E1429B7316B24795F35761738E472277684FB02A43BC866304D07EE7C9BBA4E2F9860D23C7802B3A3ACB822E2B818AB80BA639C0E98F6DF26F6E48856EE7A49688431D4756B368F463C0710AFE21A17B19284304B7DAB1B5D34586E5798D38E44ED9191AB95A930E14359AA8163ABECB1D84119F654919C0453E9CBFFF26A8732C7199CBBDA1B970DAA0CF600BD7CBA8BC422BE0661F4F281EBE2257BF6A3B4E3DB28BD5C873286BF562C38032B3A27424496E1D7FDBD2C9CF40BCFC383EABD3F7143A0CD0546863CCE86DA37D882A8665BCE7FAE0ABC1FD1C33B3C7C7A3D8D48DEEA79F781EBF17043BBA37979F93F5924BA6CDAAC3665836CCE4E502AC15879B88B10F73527A5BBDB8905438E070746C3290993BEBDBF4594CBFDEB5E6DDFEBD719DF8AAE78E697CDD21360C59A110D9FB95F91A68B94D34E1C9BADB42039AACD845ECCAC2896B2C1F8862F4A3318AE10B3C6497D552A08803057F2299216083DB87D08E8A1A0569E6BD784555E989E40DD31D345A1FE118F6FC24892299778BBD82948AD3A91D52CCBD786DCC695675CBA78687E83EE59280E469CBA0B3AD1A22C0522B50073C8416B2D71F09B2FC449144B71F20174A2924FF2B14A087103046EDB08F3605BB467684B sk = 6500F32C93415CFDBC0BD31D78D5BE95CB9060C8CFA2013955B56F8B6868B322393308641A9A4647F230201E1389624A296B55192A9819FCB19AB77C25F954454E963EB0D01B937D6DB5EFC6661AF40327D3FB38DCCBD9E61A5F5A7D70A54A2524D1A2D78460EC9F56AB75B10D34A7D4C0CFAA384F1D6AF0CF75858E65B209FE81F435D3852EB820AC7F5213D3D024DE3E6273AAB9B06F0F24E37155F45F373D722BCE7912FE9E0DE98994FBBA6AF072E2DE886DC9ACDA864E1429B7316B24795F35761738E472277684FB02A43BC866304D07EE7C9BBA4E2F9860D23C7802B3A3ACB822E2B818AB80BA639C0E98F6DF26F6E48856EE7A49688431D4756B368F463C0710AFE21A17B19284304B7DAB1B5D34586E5798D38E44ED9191AB95A930E14359AA8163ABECB1D84119F654919C0453E9CBFFF26A8732C7199CBBDA1B970DAA0CF600BD7CBA8BC422BE0661F4F281EBE2257BF6A3B4E3DB28BD5C873286BF562C38032B3A27424496E1D7FDBD2C9CF40BCFC383EABD3F7143A0CD0546863CCE86DA37D882A8665BCE7FAE0ABC1FD1C33B3C7C7A3D8D48DEEA79F781EBF17043BBA37979F93F5924BA6CDAAC3665836CCE4E502AC15879B88B10F73527A5BBDB8905438E070746C3290993BEBDBF4594CBFDEB5E6DDFEBD719DF8AAE78E697CDD21360C59A110D9FB95F91A68B94D34E1C9BADB42039AACD845ECCAC2896B2C1F8862F4A3318AE10B3C6497D552A08803057F2299216083DB87D08E8A1A0569E6BD784555E989E40DD31D345A1FE118F6FC24892299778BBD82948AD3A91D52CCBD786DCC695675CBA78687E83EE59280E469CBA0B3AD1A22C0522B50073C8416B2D71F09B2FC449144B71F20174A2924FF2B14A087103046EDB08F3605BB467684B ct = CEAF18E076A4B4B4DAD20727B13122FC6360DBE3D199D828C045759CB9AE00AAF45A0BAEBE9F6EC548E51309C80A664470764738DBFC4518E26C0B25C2F1327E582822EFEC7F18B8FDA19DC104492754B84CC381EFD67E0B651BFB39D156B0305B18670243079CF3635119A3EA9F9791BDCF991A147EF41B5E67536A50194EB5C0F8C10A62B56DD3A1D7909DB17F29D6ECF8CE599CC779B27A5AD8ECA84BA599F03F44E01FC94755FDD6750554F1FFA2FE07ACF4507C067BD6DA6445C9BD0BD5BEB9F9E8E69CA68C722257741DB9A549489A3F1E2467F4FEF863799478104B932EAA3250445C845632C170FC52C59B4C39A00B48A7BFB506540424BF6FA49C1E55896769DF842C8562CBD4BBF2937236C4230F1B166342DEB2282BAF3CE2334CF59C63F6B88B1EB840E85DB9BD0C592A86EFB278977B95A5B4D960207E23A674BF6288BA39F0BDC2F348BF90936D8B858C8B29DC94B1ECC76A154B4EA5F879726CC3A38B1B8ADA8B076B71FC2BA48A8A85DACCC0564E2D36E1B2CFAA019994BDD0E1D5A255B4B14C2EFC49FBC3F8B96FB37C96E385BA9C25E4589095DD04F3821F18E64AB6CC8167D4577531B502C24A280CF7A9B59125ED192F3867DD6660094749C98424EE55E6A7CDE1712F3C833FBE5FA1E0D40A29C10C09FED56EF44F30BBE926A11ADC99331C5CD8885D0BFFDA911584C854B87CF75220B0C2C80F5052D547ED7CC660DBBA99BE2523F776E24BDD87F622604E2DBCCA4837CB36B25FF66D7FF42D4C8503DE4E3C0CCD2793AE18EAECED1CD8360E9CCE19F71A533C8CDD3514C5596D97D89FB4D34A09AA2046B630BD6C0E ss = E8769152ED96B45CE212ADB3B7A1EFBD2F52E9F870C8DB9B count = 63 seed = D995D38F934B6E1A7CA77C9522E3D037676CC939B0C8BD4B84394B3DC91A791F09D2D97199258C9943DA955E7F7B26FC pk = C61A932548AAD82D2F87E7B4FF54DE3AC7101C10368E9DDF996A1FA5284B66FEE4C39A58818E5EBAC55E04DE890655C74A9ECE24A3A6AA7807138E3988B2E4F008530134C0DC4FFECB4F27B4E50708B1DF390F06223AC4C3288829C40D428E5B943EB0B2C955DEC738939D3C061EEA722089DC39BCEE34033A12F515D392ED23C5F617F5F7B8F8A0BE077A6A4B17AF7FAAD39F553E782D3C2A86EEAD047588ECBFA6163A0156CDB96A1A767E8487279C805C9ECFC7155F7CA1C1B85E313B5992A765E9808B04A82FDCA0EF13C96F1F2878BE183496CA45A4DEF55A73C6EB9AE9EF9EC8479B1F2B369034ED1535527447197F6E1B605793F0D89255C3E48ABD1DC0C859EA5517FCE86D1E7FA3B3DB0D592805750FDA11B4EBE641310B026E945204EA67441C2EC2291B1AB79A4EEAE377C94103D2C853137FC5AED4930C2E7123949B2EF21D8D02E80F611AC9C556BBF882A5458B4D6E4462F8735D8FB4B198A006830F344C2090CBFB178283B69487B528DE2D5C498FD037A6D2C0D84E7B341CCF4AEFDAC4497B3A4904592AE87A42681B26B77A08B8D4800638901DC43E8CA4EED00C648CFD3C835C6A2ADB7029DDB1227E603B4D3777AE7EB7538367D27E687EFFEED0233CAC61D8C431162EF5B3636D7120C0EF61B1FC2D78D8BFA68235692CA3026CABEFB0EF4207F748551F1374DA4327540964E3334D233043E12CE926961F21FDD9B2CB7A5645E358303E167C20687EBCCE5CBAF9C4CEBA4D3C520FE067C695605632B4ECC8C75C3CD71F888C6817E402 sk = 7643CEF2D62CC5AAEECF754653EA62294CD2208E5BF3DDEEA209E3DC45373D49EAC9D531A532770837A854B4F5531F6E0C8D6C10183B30D3435498C2DD142951EBACBC33859B828F9FA95F5C4C114702C61A932548AAD82D2F87E7B4FF54DE3AC7101C10368E9DDF996A1FA5284B66FEE4C39A58818E5EBAC55E04DE890655C74A9ECE24A3A6AA7807138E3988B2E4F008530134C0DC4FFECB4F27B4E50708B1DF390F06223AC4C3288829C40D428E5B943EB0B2C955DEC738939D3C061EEA722089DC39BCEE34033A12F515D392ED23C5F617F5F7B8F8A0BE077A6A4B17AF7FAAD39F553E782D3C2A86EEAD047588ECBFA6163A0156CDB96A1A767E8487279C805C9ECFC7155F7CA1C1B85E313B5992A765E9808B04A82FDCA0EF13C96F1F2878BE183496CA45A4DEF55A73C6EB9AE9EF9EC8479B1F2B369034ED1535527447197F6E1B605793F0D89255C3E48ABD1DC0C859EA5517FCE86D1E7FA3B3DB0D592805750FDA11B4EBE641310B026E945204EA67441C2EC2291B1AB79A4EEAE377C94103D2C853137FC5AED4930C2E7123949B2EF21D8D02E80F611AC9C556BBF882A5458B4D6E4462F8735D8FB4B198A006830F344C2090CBFB178283B69487B528DE2D5C498FD037A6D2C0D84E7B341CCF4AEFDAC4497B3A4904592AE87A42681B26B77A08B8D4800638901DC43E8CA4EED00C648CFD3C835C6A2ADB7029DDB1227E603B4D3777AE7EB7538367D27E687EFFEED0233CAC61D8C431162EF5B3636D7120C0EF61B1FC2D78D8BFA68235692CA3026CABEFB0EF4207F748551F1374DA4327540964E3334D233043E12CE926961F21FDD9B2CB7A5645E358303E167C20687EBCCE5CBAF9C4CEBA4D3C520FE067C695605632B4ECC8C75C3CD71F888C6817E402 ct = 7E5D9EDB7A6B0CE8105A0196F0F844FBF5BB1BC577A5F1BE27B94600B284CC1796251FAA7A4A8D7F46694C874257E4A528C5EB5DB8A139BB39DA6D89472CA9D857C601FCE739B9EA268118181F0F5EE70930716DD8880652B3A196EEED5E737DEF7B5DB692470365FAEE611193F9228AAA5683B0E90561D36416126BFE4834B7E220D09E9A6F1A2569DD6AACB9BD1CA6182EBEDB5D6ECC4A47D70719AF6DA1670EF1BCF22CC8D245454FC52016D446D8ADFC7950B2C1D712DC04621206C0FDD7D1770F283E40B932140E7E5849BB242C6EDAD3A87D4A8461AE3D13AAB4A1642AC3F6D484EB8017C290B76FE604F52B71CD8D98C4B30622D2BF5E0EE063CC7970C8E6FC6E6FE616A0BE4B15140DF6155BFDB270C445E840BA9A05488C6823ACD0BF416B991CB362DAEEFD8F69322F84FFC7FC23C332A198D106B2A5EB2DEDA56DBB951E6353779F19A7E476D8D6F29C4117FD66B2C59ACB7932C5FAF9BF0DAD9C3AAA37D91C2C01C081E4D5069F11EA33265FDCB7BD549701D5A4A7F7EC70EC8F82869BED88F4DB6B7DFAA012D3197EEFCF7F7B0B5A18B21BB6FDFC90F0FE86C9BEE993F2E519332C3C5D3DBA8A9A38FE2025AEAD8A948AB8E8D5479086262FD5AF9EE47115143D2CC78470AB43CDE5DF62AE2A16840D99C7A2248FBB8EF32BCE01F0A4816405E2C6F4151A059AC0147C035E4892C9CDBDAF96B947216698D1B921FE7A318F43520D1507DAB1114C25CB8832D881A7FBD6DAFC3A9450740DA6DCC7FF0C22EB3FB8FBB75249E0E4C4AC11E0D820023DB0939121C5213082C1505C831FFAD7407FCE1FF7C6D892876CAC5B583D7195 ss = C482DDD09802B47F86E06483C225DEFEE3F619FCB22B22E5 count = 64 seed = 5929F02A271725CB40200DE32D9D03D8BEA53B53AC83186C42C7F565CCB1CA508305D470850CF86E9B2C61A5B8CA1C93 pk = 022C6BFEC937A2578FBA580A3C407448D47F4740C3C09ED70B8210D0DC8F93DCB4A0A4F6334FA3578A3833F3005E76077A417EE88ACAA7858241D882B84DEE8A5446BF75E5D03A686EC3D96329713811DC456A359689AE3BB590D03B0046C7A55E42A2F0B46DE811FAB6249F5F4D31AD7F8AE893CAEC6E1E42278873C62E6F1D6F371A58F524B59C8184151F658D305C933ABDA5C9821DCE785487D26AFE66435582504ECB8D4D3B65249C0C2F5213BB8C142268D90FB216FB61C64CE0EB0335217F61AEFAD2776E39B59B6A400B986E37A8CA5CAEF27748729840E3352F5A451E178F55AC19DF83B0A20F00823C59877482342D238E50028942F6AC43BB79891160744F8203EA501CCA678997CA24DC289E195D381F5BCFA125B7E245B5C4E6CFEA0B8DE1A84B3D77F6E52D57031393B477539653967FDE9B237E1B78215E6F0886B3082150B0604E8DB776F4B4D27D1DDFD3602AD36CBD413FCA693472BCBD848FFCD16FCDB54D1A4680AEFA0A3097A84712FF54EF3652EB075A9E091E43D2EADA220B1A4801EA6636AFB8F2F7AD2BA60EFC02C1409AAB177A9A31B206DB28D3B12058FF717D53EDED7B66498B62DDA80731F1DF59759C7BCD0604E6F7A8483B782C18DF165F481D25F98E7CAA7EC385D06C575552FD4D4D731A01DD468AB43814131A5D3A56A89EF2D31554BD69BC3E9DECD9BBA925092412F79C96468BF791C4A04A5721DF6F472A5A20ECA1B666DCD3E54B1D77CCAD122FBEECBE801B5FB63502605379CE3B26A6BEDA64A57989D005073E sk = F8EE95521060C03BB8DACC79F7EB7DB640F545F315613A35D447A09E504CB4E13FC3D8392CB53F36ED647364A04E37278A0E0A45B720F4A75C580C9920EBA98D497462F26B431E889F56A33FC9499002022C6BFEC937A2578FBA580A3C407448D47F4740C3C09ED70B8210D0DC8F93DCB4A0A4F6334FA3578A3833F3005E76077A417EE88ACAA7858241D882B84DEE8A5446BF75E5D03A686EC3D96329713811DC456A359689AE3BB590D03B0046C7A55E42A2F0B46DE811FAB6249F5F4D31AD7F8AE893CAEC6E1E42278873C62E6F1D6F371A58F524B59C8184151F658D305C933ABDA5C9821DCE785487D26AFE66435582504ECB8D4D3B65249C0C2F5213BB8C142268D90FB216FB61C64CE0EB0335217F61AEFAD2776E39B59B6A400B986E37A8CA5CAEF27748729840E3352F5A451E178F55AC19DF83B0A20F00823C59877482342D238E50028942F6AC43BB79891160744F8203EA501CCA678997CA24DC289E195D381F5BCFA125B7E245B5C4E6CFEA0B8DE1A84B3D77F6E52D57031393B477539653967FDE9B237E1B78215E6F0886B3082150B0604E8DB776F4B4D27D1DDFD3602AD36CBD413FCA693472BCBD848FFCD16FCDB54D1A4680AEFA0A3097A84712FF54EF3652EB075A9E091E43D2EADA220B1A4801EA6636AFB8F2F7AD2BA60EFC02C1409AAB177A9A31B206DB28D3B12058FF717D53EDED7B66498B62DDA80731F1DF59759C7BCD0604E6F7A8483B782C18DF165F481D25F98E7CAA7EC385D06C575552FD4D4D731A01DD468AB43814131A5D3A56A89EF2D31554BD69BC3E9DECD9BBA925092412F79C96468BF791C4A04A5721DF6F472A5A20ECA1B666DCD3E54B1D77CCAD122FBEECBE801B5FB63502605379CE3B26A6BEDA64A57989D005073E ct = 1A4F59F4FD7A0F164F77D6E5FA6F4D3E251FC40E4E823A21D992F09157606B947BF13B2788ECAEF8EBE32642D75DF58EEF8FF99D21BBA13ADC59D4AA2FD7F28B2CF26A1903D037CC09F0B2A2DDE50CD27C3A9D150BB386FDEF76380E73567A1F0B9F22890213A651413FC15DC953FE648DDB7DE35342D19A0F0A24F1EF42984DC21D920EB659B4AEB3CA8AC39981B253C43294101C0A7DAA7F50F7E69ACDF72156E7FF626C2442FD4C00E52D80F055331273B77DA82B005AD7D9FA1AD92D64D167555E1A3033B580FBAC8B56C21C7653021299F06684870765AAE5442B8CA2BFB817A9DF71BD493C38C40F7B238A65D6C83AC975BC80FA709540179FDC2B1A8D89672F3C1542DFB51F095D88AD60BD5824A20BA484EC0D56923BA30B5D07C5A94DE491632347475366AF747DB8DCC9314E71946463EE162FB257E7DE6CA5D7A3AE0F386BA7F6F64FC6B6A7FEDF8D9047344B24CE0ED505C6B7E781935418C2DFB0497C4AE9E4525B370C753B31D3D17CB025C42B3EF40D102AEA56FBA554BDB72A191C951253606D8BB692DE198852F40AD0376C8A0B1739997E1BE89DC20225223B1A8FF5640F376DA247BA617F859F9B23EF5138122DBB6662660776573EDAEB0E1CD20A8CB1473DE89B2609509869D025F2A5C23D9BDB3425FED017D9A369269AC0FA0B4BD52E1D8CF69C96EE8AAB968272FFC9F8A0DFD89A6C5781CC506B60079249B324D373A7A15D9505274094FC7A209F91C02AF0CBF16238927A39CB85502DCD98B2185D4D7B1906A21D8989D60437438CD088D7AAE1EF09B0F7B3AA43FCA31BA3B6FBF260BA5128D71FE1AD7FAF80F8 ss = D9EE11FC4CBEC6C83EA26F877BF46AD340BB5BF1F59ADA45 count = 65 seed = 905074033D7B75DEB2D06A2F29144EB377B452534C5710632989F02D45312D156557E96D4486020826DB200153BC4A8B pk = A7FB6B058EBFA4166D6C7E82D63EB9913EA64545EAC89842A4D462D5A4F7C4A2234B158116DA9D7FD9A6BC7C922E050ACB580A22F5897982993DFEA19351B3BF8ECA5A9CDD0461559B4D8E1F0269F9FB4A298AEF22977FD34CA31B726B418B7A135748CFCA60AF1D06023364CA42205BE1639D62C3280C9404B39477730DCD145FB8662CEFDBB33D13B661098FC5561A81222E1E59D5289C7C5FA07B291CD16DDE9AC7B998888F6923AC76C4C5B76B2F19BDADC6D013689C245DAB06AC8EDFA88D153444BEEC24CF9E6884FC18124E04352BE71F947B7838326B371578B71629B1FBD96E06A1406E71B881582700BB8967E9E1014D678E431E844B5062C9D1E06DEC377DFE86438AA7072359BF7ED993E4FEBCF2E2B2312F91314058A81B2A3BA8E99144C44C13FCF2ADC272B5C0C261246C7A359E340C04F585A79F2394F502B491E08C228DFFF7FE712FAC6C74BC61EA01848B17A286F7DF14800D63C5576C24418C6519557B0F235664F398556D37AD54289797DB9763CBA92A85F072EE1A054127724E89D6AEE4A79854F0A07EE1A0EDFBE432A40DC12D61AF506D14403CD3E6B29219E3E908F0BCD989DC74B2A08656F5FCC72681D3BE501928CC851461642D454CF1F57BBE2DD199FC117E6BBB41022145D45F0D31623B1C40EB04921981194AAFB5A40E6CBB12E2ECABA4A97F812434F3CE94C6C78D43BD654066B7A947304EC920B91B0D3B5440AE84ADF2E0B6038217450596EB4021A32A5C2E1C3CFC6AAEDCA9BE2D15F85EDF1EE3EEFF0B07B16E45 sk = B8BD0493A882E3A49B4E0F6256FB1FEA0912562FD9BA26EC3D6C9CC12C8973ABD7E4B5D8021C486B9C3114D7CBBEB7CD49EBA8A61BC2BCAE1F1BEF30A1DAF76DA93BC0A2D45E032A1546012E75DC8D03A7FB6B058EBFA4166D6C7E82D63EB9913EA64545EAC89842A4D462D5A4F7C4A2234B158116DA9D7FD9A6BC7C922E050ACB580A22F5897982993DFEA19351B3BF8ECA5A9CDD0461559B4D8E1F0269F9FB4A298AEF22977FD34CA31B726B418B7A135748CFCA60AF1D06023364CA42205BE1639D62C3280C9404B39477730DCD145FB8662CEFDBB33D13B661098FC5561A81222E1E59D5289C7C5FA07B291CD16DDE9AC7B998888F6923AC76C4C5B76B2F19BDADC6D013689C245DAB06AC8EDFA88D153444BEEC24CF9E6884FC18124E04352BE71F947B7838326B371578B71629B1FBD96E06A1406E71B881582700BB8967E9E1014D678E431E844B5062C9D1E06DEC377DFE86438AA7072359BF7ED993E4FEBCF2E2B2312F91314058A81B2A3BA8E99144C44C13FCF2ADC272B5C0C261246C7A359E340C04F585A79F2394F502B491E08C228DFFF7FE712FAC6C74BC61EA01848B17A286F7DF14800D63C5576C24418C6519557B0F235664F398556D37AD54289797DB9763CBA92A85F072EE1A054127724E89D6AEE4A79854F0A07EE1A0EDFBE432A40DC12D61AF506D14403CD3E6B29219E3E908F0BCD989DC74B2A08656F5FCC72681D3BE501928CC851461642D454CF1F57BBE2DD199FC117E6BBB41022145D45F0D31623B1C40EB04921981194AAFB5A40E6CBB12E2ECABA4A97F812434F3CE94C6C78D43BD654066B7A947304EC920B91B0D3B5440AE84ADF2E0B6038217450596EB4021A32A5C2E1C3CFC6AAEDCA9BE2D15F85EDF1EE3EEFF0B07B16E45 ct = E89C78D21C1A288CCD4868ADA9525510289888CEEBE2CCCB430F8597D8506802FCABA4A4F1158EF04DA5B17507F5BAF9DA072A1285F00368025F960D7E2A616EA8F420ED23C4B91AADE399A7B548496A5FCC784387A37D62779C03BFFB04A83CDB21A8B23345E9C9EBDD89C23A477FE7908CF6EFA6E57313559B2F0B400119C89255768E58D7F40218DCB938B619421EF5682B73E05F9A7988B5B90A2E2380B16673752D261687FDA8D65F2F6CCF24BFB3AA0381571EDD626EB403377F5EE36FB33C0A23338F281F2FA692BEB2AF22791D34218B0DB62134A1048ED17C1857F512BC122C564DFF31018EBFB23CC78A0504000FCE7CFFC300CB2669AA955B3AD4C9386B19C580D39EA9944FA8DA4B2B2420284388E6AEEBE4D910D00A3DF20264BF7F1080FB51CE4B81A03A39695034430C625062E72962A5D394288F33DAA72072703B81BBA27E75E0602DC1DFD5D5E7E43B248008718BFB1BF81EEE71F8B0AD21933D2AF7CA5CC420BD6F603CDCF02FF35CA49E5AA129506CAD550AC329C33D963D67EDDCB4051E12BD1F702E5416BAC3AC558D481EEA4B5F2119E92474E39D58E7E24598EB3F2936F3660CB40233D3D8C29C4F324662207C3B9456D493D95DC7BB59BE6BE89E260D954A86EB0084C2F5FEDB925051E3C698D35D37463FF1B1C5C990EFD8D1FAD4FA8B167538580E6FA9921FDB094D29F60909C2270E68ABFFB40C2769B3131694CE4CC31283917B2EF3EEAC04193BC4627F93A28CB0B70BE516FA29457B4A1EDE1F6EAC1A87972AC5D781940CD665A7F27C08C55C1CC42226B25DC624DA97B3D160D0C7554B7017C1C422A4BD ss = 95E14F79CB485BA89A125C5C4A957FB059FB83D49399894F count = 66 seed = A3E2E511AFA7BB560446BDADF67D2EE2E16FFC7BAEAE7EFB8C5455068BBD4E91BF9BE9D98B280072FABA7712C75B26D4 pk = AE9A29B71848398E983311906BECC2DC2D7BB53BB161DC416CD80B4052D2CA81ECDF4C548CC7603E802FBFD1E6BC6BBBC25CEAF779EF68EE156147D1DF8893FE410E9E87E67C26E7DC85094745B8A7E6E3B40FEAE079B030DB12B6A3932C60683D313203FFBF121108F819B8F6E3C4A8AB09D68496EA07020AB717F01EE3D6EADDC0AAE5C4A36D10DE74477111F316331178F5DBD21DBB80AC73964A686EDD2B61749BCEFD34EA11C8516B56027CA50C874777B0E328524FF4DD0C613522DBBAE4C7FB92BE05A4F17C48A5B7140A0B0B5B8F8F77640796C31ED050D383343A4574452935F82ACB536A6C31DAD3002945E8BCC54B5C8D667B1FC08998FCCAD3D2EDA813A44BE62F44218F930390E0C3913DDB3842C27060F39E240AA1D647632446263E22BB23AFDCE38AEC769C67BACD25BB269DE9BD92746A44F683AD4E83F44DA9CD875ABC72C929AE88477F1417F005FF3A2658DC6209E716ADBAD896E3686053ABA1EFAFDBA7639E68ADBDD5CE7E76AB5C124CF5CC0CC0CAD1912FDA617F49E5702D4E228ABFE606B172EFEB423F0EADBFD126CAF01FF1BC025E2481F9158D19A68E9717C691396789473CE66F7185C591FDACCEEF2C4EA19022CF30EFEBABA4AEC36E1627C8FF3A25118B39165D92AA435805441758E429291F6F6601A6DA3D465D301E2E3389C61B2BBF61ADFAD917690DF999D4C354E9214C5A6C925164CFB3FA3F04EA75D4DD635B7211E9049AD331015B52D144EBAADDB81910EC06857216EAC81519FD11B868175F667A23B1D05E4E sk = C0407E41DDF48D333978B89BCF2DB01E4613425B456249E76A6F25B8A2827BF5B2DCA81E3F5F748D23C9D356A2209F6B2D60247B2E45C9808DE497F64F1246436D0AE40E7A499B148DF04878ED898201AE9A29B71848398E983311906BECC2DC2D7BB53BB161DC416CD80B4052D2CA81ECDF4C548CC7603E802FBFD1E6BC6BBBC25CEAF779EF68EE156147D1DF8893FE410E9E87E67C26E7DC85094745B8A7E6E3B40FEAE079B030DB12B6A3932C60683D313203FFBF121108F819B8F6E3C4A8AB09D68496EA07020AB717F01EE3D6EADDC0AAE5C4A36D10DE74477111F316331178F5DBD21DBB80AC73964A686EDD2B61749BCEFD34EA11C8516B56027CA50C874777B0E328524FF4DD0C613522DBBAE4C7FB92BE05A4F17C48A5B7140A0B0B5B8F8F77640796C31ED050D383343A4574452935F82ACB536A6C31DAD3002945E8BCC54B5C8D667B1FC08998FCCAD3D2EDA813A44BE62F44218F930390E0C3913DDB3842C27060F39E240AA1D647632446263E22BB23AFDCE38AEC769C67BACD25BB269DE9BD92746A44F683AD4E83F44DA9CD875ABC72C929AE88477F1417F005FF3A2658DC6209E716ADBAD896E3686053ABA1EFAFDBA7639E68ADBDD5CE7E76AB5C124CF5CC0CC0CAD1912FDA617F49E5702D4E228ABFE606B172EFEB423F0EADBFD126CAF01FF1BC025E2481F9158D19A68E9717C691396789473CE66F7185C591FDACCEEF2C4EA19022CF30EFEBABA4AEC36E1627C8FF3A25118B39165D92AA435805441758E429291F6F6601A6DA3D465D301E2E3389C61B2BBF61ADFAD917690DF999D4C354E9214C5A6C925164CFB3FA3F04EA75D4DD635B7211E9049AD331015B52D144EBAADDB81910EC06857216EAC81519FD11B868175F667A23B1D05E4E ct = 460213A94691E78A02E704E99FB964F551D7A88F5F9A3A44868AFB810AAF0741CB38CCE534C6BCA0C570976F1230D0873B0236D981EAFE1C9F839AB8D8A39A56E3E10B850A555BAC396B8C716994C46840F308B80A13B020D01F0E06500B3C57E66DB6195744C23DE31C59280B39CAD4C585DF14A1B422CFB91864E4EB6A1A599496481CB25B5355BDDF09559399BB77641A93C72CD0D6AF3287F654F3B521368CCDF9A8E7DE88CDB19276D55417FABACAEBB227384E00B54011BD0903A58C7CEFFFA48B8DA91FBB37D8EFCD5D43FE3ACE1E48A26661DB15CC0DA6A5C97FF41B9C29C130AAF0CB9370D829ECA239BD62A7ED432CE223AEC52B5CD9838DC0E56AFD6865B5A54597880D244EBD63CB697D716CC02AABB2592099678A4A3BAE19AD43CFAEEBA78C108FA6A6413A900849ABF54C587148CF9001E9690C2B85D04FF2A371130D301DE28DFEF0A5A57B9FD4D9B63A18270BA6F6F14121EC398ABD4D9E4055EB31BC817CA34DB91732550A8D03EB878FA7D6C2622E9D7C6D5F1C85BCB43E6FD763C7867083DC8979D984FC6E5DE3A631C3A238A297B2C453B71FCA16FAA6443DBD5D6F3864D7CC83C09277AB19563B422250B2A615C7E2034FD643AB9CE38CD8D5F6ADC04A8B2F4C4D91F2C8B6C9A9FE037536578A83BC864697DE1B14A4AF5020878FF42444D7F1F227ACF140308BA58B073DD0090EBCB2717BE03093145ABA0CA37DE8A86DF066EE44943299E74A6FDEED613955382A847BA55C45B7D0D5A1C420B8B4DCDDBA7CC31707703EEF9CD44E87C8618B7EC66C3AD1D1969EEFD1FA23DB388753DEE16A4E7C663B185D5E0067 ss = 42D7749371FAC2D7DC8CA6C903D78C172E7D986DA1B36F24 count = 67 seed = 074AB1A37BA5A0403D8F68D26FB787BC2C90F5EF88F2A6D286C3E6B168ABD85D393D8225618608B8EEB301D26AF53BC0 pk = 1BF6BCA84C552B7221E5D49C5CC583B5153ADBD7120CC6325A0EF4E07FAB16BE09661F9DDEF49417B62A855DD5CAAC84C2C8F2178609DFE99B33F9D238B4288F0624EB2429C9BB4A0C42B03D6946F5812A256EA01663F21B6EE62A938B261148C5127A6A360A689A1ECFC631B16E970105E85E302799345CA46C6201560800E73919472F3942D31A575064B20E007609AEFD8264B7BA486AFB293569485DF3CC611BC65677C50BB67850CAC91218D95882B1ACD15D32E76823F4533D1461F022F217F53E6230DF2147E107E0C427315063EAF6399BBCCB5E1E14F33103975250C87FE31AE5A7ECB4FA58DFC3305C66BC07684A304B9F70EBDEF155B99D0916FE83F9574B95F8B6026817F95FE2C0EBE523F4EE5B41784C7E8009C9855BCC22B5C079D862AE950B8C9740085BB95AA2E1105952E22DC7B72970E3A386E26794BB123CB18FE0C28481ADE1D58B62A371E42A599E8B4613E5BE86F016C2F44C275B0598A37938258FAF473372141252E742EB5A5377CCD0B5206783192EF6B2A1EE6D119AF10E4642CF58F7607F948F8BC88CAC95A11398E6B258CE61CD0B3471D898541FE6793D6E62100A4EE5984253CE9A0FABE48330BE7F9041ADB7FA59986D3037265169010239D6179E877BA9FAB239D5EAC9764482A2CB8298FBF2A62AA0BD701F6356A96452A08DCAAB8867FDFB1DDD8CCDDA1ACB92EA48B5F89FEFB5D31512DDB0944F5884A91ADAA17A4EAA11EA6F79D7E36FFC64A3DE0F11C6C5055ADF89A91FAC5A0D69137B3883FD9D41155F924D26 sk = 334382D39164D1989696A2FF77B25A28AF8BEAD9883B5365EB6FCCA7C1781CC9ABA5068AF837BE962F439F233593D193CE5E08F7D66EFB3389885927B89D252397F0169ADCCE240CCE953AC7B438B9011BF6BCA84C552B7221E5D49C5CC583B5153ADBD7120CC6325A0EF4E07FAB16BE09661F9DDEF49417B62A855DD5CAAC84C2C8F2178609DFE99B33F9D238B4288F0624EB2429C9BB4A0C42B03D6946F5812A256EA01663F21B6EE62A938B261148C5127A6A360A689A1ECFC631B16E970105E85E302799345CA46C6201560800E73919472F3942D31A575064B20E007609AEFD8264B7BA486AFB293569485DF3CC611BC65677C50BB67850CAC91218D95882B1ACD15D32E76823F4533D1461F022F217F53E6230DF2147E107E0C427315063EAF6399BBCCB5E1E14F33103975250C87FE31AE5A7ECB4FA58DFC3305C66BC07684A304B9F70EBDEF155B99D0916FE83F9574B95F8B6026817F95FE2C0EBE523F4EE5B41784C7E8009C9855BCC22B5C079D862AE950B8C9740085BB95AA2E1105952E22DC7B72970E3A386E26794BB123CB18FE0C28481ADE1D58B62A371E42A599E8B4613E5BE86F016C2F44C275B0598A37938258FAF473372141252E742EB5A5377CCD0B5206783192EF6B2A1EE6D119AF10E4642CF58F7607F948F8BC88CAC95A11398E6B258CE61CD0B3471D898541FE6793D6E62100A4EE5984253CE9A0FABE48330BE7F9041ADB7FA59986D3037265169010239D6179E877BA9FAB239D5EAC9764482A2CB8298FBF2A62AA0BD701F6356A96452A08DCAAB8867FDFB1DDD8CCDDA1ACB92EA48B5F89FEFB5D31512DDB0944F5884A91ADAA17A4EAA11EA6F79D7E36FFC64A3DE0F11C6C5055ADF89A91FAC5A0D69137B3883FD9D41155F924D26 ct = 9F5485FBCA97BCC83C6FB7DFB90ED4469ACE310F24F294D69C73F621852904865964F401DE456514AD80C753E289A51E859864F9EF9BA38A32C3BA82B711584B4FACDECBB699917DB9688DBEA55B146925923F723C2A5FF73B03B0928314A1E460CAFD8E8A5EE1BEE3180380F9D7DC8EB01AE0CB60DB213704F208194A42976720CAA97EB7D1FF3290180168D55301E63A41A06CD362DDCA0FA819CE462EA12CD570429B1BC453CC9D34E63DFF6266564B31A7BDA2C7C35A8005A829E0BE555916C153DD1D201FB87620F45D885B07821C59419E51D828B370B905572E4D8F99FF66B5461F954ED288725EE3CD2F34767860749644853A171B87C9334CD1D885FB31CABA9D31DC38992F0F0A5835EF35C121711EE5EB19B9CC11849F0A063E261742538B4D4C62BDA53ABEB438753977BA8FD2D7D609DD411887065447AC9C70513306018CAECA4C7FDC7E91859CA604616FA941E9B128A4FEC3D34BD4D7C9EFA1481CB31B812F35A86677DBC1C0C9274B02CE3B2EAFB92CB5B3DD33AA9DC25AFD763E9224598385F8F115C98B999DAA02B34B489C0863B371471E499BD7BB4C499107FAF14A91059B8404BD51C04D6D10A71EEEDE4571867B3114DFDE446B09D018250E6F34FDED61FEAE29A5A891D0977CBADD9164562E242C897608AAAB223D1BC8B34566DB31D94C9C067BB81953A579C827A13829BFEB980E3E7D7F215754F36E3D62C73C648C4868B3661F2E3EB43F5D79DBB5C37AFC0145DF02DF2D9A1C67B7BB4D92FEA2D7B8043ADAF6823BDBD6BE34A184113AC9EC62CD128215A925D58F071A4AB943ABC2ADD53DA9D43B6D42BF19 ss = D514C3A40623FD15BD9B8017ABDF3947B6D2ABE53CD40ED0 count = 68 seed = CC0C86CC0ABF86FA21899BE1953913C00E7C46E6B5F730C4E88B3C034012763981D7F14459D3081638080378348856EA pk = 51A1E22D7F3AE6935256BE150D72CFF6C4CD149C02F0B5FA7AD71A0EB9FFEBD1879099F76E1394026009BBBAAF98DD592EFBDE5B654CC3E28BDAA5F04E1BE04643F4DD1C101F0C9719B1FEDE627C0E5D55CB8877699952599B21AE0F4B5AD0A2197BECBB10ECA85C8362690C1F519224E1890024528D7DDE9583A0F6D8EDED4D23DC2FCC666413DFE0ED80133B9739AC0C719EB2FA5824174FCE73A2045E7CD675BD1B59D00F252C74FA0D46489AEB28C882BE8582090BA851806300925496FC57E81BB1ED7896F7415FF54AAE5E47FF7E40BE8C903383EF8858B20480BFFFA934AE1EC7526CAC5705BFDA896F72DF1F3A73E98A8F75ED0684C85C60AD90BE99058482265B9F0FAA54FCFED2FC737B0F0EC2C958190C56E9306FCFD0685D45C80C649E4E0D342A834984B2F5345714822BAF311825E878DC1AB614471E3C42AE488A9C0B457A3A6041CDE3498DEDDAD2FD8FC535BCAAFBE7E751A72169D04CF8449FBFF505CC9A9B8DF7A7FD9C90E9BD1FA10D22505DA93E91DA7B4FEDB5CDAFF5B6D0DF2FFE1726E6A82792224B403668F5C1F60B31B33995E97952DCAB0591868AE476AC66501E6FB371E92140BF861AF8BFC0AE1DEB1E5BD21254A1AA4827649B3875BDAA426B15176A168A4B0ED622397740502E351E60CA1E5296294037429E4FA5751A6F189764E44875E5A2395B432619CFC69374FB987FA882A932D385C353A13A06415421C18F652893611F94A67E36504229F480788435B5483B14578E29DC9F8A7A9D3CDC0D7CB30FF94BA818361C sk = 6995143E8EB8A6E93840F76EEC844F67D2B5F75B1839A5040337E61F9806764A0F4DFF8E56F68440836A072412A30D851ACE2C7C6F02D60E7A8420001A63E6C6289AD9FBE5D49083E7078F73238A240251A1E22D7F3AE6935256BE150D72CFF6C4CD149C02F0B5FA7AD71A0EB9FFEBD1879099F76E1394026009BBBAAF98DD592EFBDE5B654CC3E28BDAA5F04E1BE04643F4DD1C101F0C9719B1FEDE627C0E5D55CB8877699952599B21AE0F4B5AD0A2197BECBB10ECA85C8362690C1F519224E1890024528D7DDE9583A0F6D8EDED4D23DC2FCC666413DFE0ED80133B9739AC0C719EB2FA5824174FCE73A2045E7CD675BD1B59D00F252C74FA0D46489AEB28C882BE8582090BA851806300925496FC57E81BB1ED7896F7415FF54AAE5E47FF7E40BE8C903383EF8858B20480BFFFA934AE1EC7526CAC5705BFDA896F72DF1F3A73E98A8F75ED0684C85C60AD90BE99058482265B9F0FAA54FCFED2FC737B0F0EC2C958190C56E9306FCFD0685D45C80C649E4E0D342A834984B2F5345714822BAF311825E878DC1AB614471E3C42AE488A9C0B457A3A6041CDE3498DEDDAD2FD8FC535BCAAFBE7E751A72169D04CF8449FBFF505CC9A9B8DF7A7FD9C90E9BD1FA10D22505DA93E91DA7B4FEDB5CDAFF5B6D0DF2FFE1726E6A82792224B403668F5C1F60B31B33995E97952DCAB0591868AE476AC66501E6FB371E92140BF861AF8BFC0AE1DEB1E5BD21254A1AA4827649B3875BDAA426B15176A168A4B0ED622397740502E351E60CA1E5296294037429E4FA5751A6F189764E44875E5A2395B432619CFC69374FB987FA882A932D385C353A13A06415421C18F652893611F94A67E36504229F480788435B5483B14578E29DC9F8A7A9D3CDC0D7CB30FF94BA818361C ct = 4CBFD2149F49CD9814521064539CD0DF762A50BE967B255FB22FBDFFA3293774DE04B2A586F2BFE15FF03DF13C621F8D2239D781137B6EBC5CAAEAA7EB14120AB19419C92B171C5B83A4C4BA51CE8410FEB03C5EEC0E91A111F97854391DB5265099D0072B72C04976EFE2FC2B10E332E98ECC56917B5ED85D6792A7F729C7AEDF0E2A9CB2498BE66355CEAC1A0F4C24C05D32F7ED7153171FE28DA6EEC08A1AD3047EBD71F6F96ADD3D0C01892EBBD9DFC55E9398AD604CCB20E64750F01A89271E80C1BD9E6BC669BC076D0C39E38FC7D85B9548B593F5D610450778453B1837F64BD04A0DC9E7700890D70100539C29FFDDB10B4AB49FB8AF03EFD8C1C6D0BC35FD9F5FA6DD51B5005AA348240F36F28D5E67C49E0483DC65A0286B467CBA28593D7852D29A6B5DC536EB55A2C77FE3D3794E106AF008962618A4981C687D3C0C4EC8C2FFF33665D831B41E2414135BF14A3927AD3B511D05CEAA7020F535E6BFAED7892D4A95E27DB22B5B918FB90D8A47F6B0FAAF25EDA7C228C4F8FA30116533D86158A3F82595F472481F6685535541C2162319CCD3F99B211562BBFF908382BC07B17C7B43F14B10B2CE96E2D0CFE51BD555797FC3CD28B58650908F6B401B436CA80DC13AF5F8C3C42A9D9D51DADFF6F950B896BE3A870C31695EAA41FA6452B6F9A718BDDA03C456BF43D690389678DA610BD3A111ABAE89805316B6B48BAF79C8FC63F97BE3E6B0B6C3237632746025782E86D15827EC39F8BCB785F1BD29578D6CE8C6AD181655263A7F0C66151A61F941E1E2D8445CE54E7D84BF9498EA43FE13F1EB84B62CFFE598160D3DFB4B ss = B86A259CA79B80325DCB16584CF627331F2D35E9CD3D1B5B count = 69 seed = 6D5A7CC326ECF3983C4E7683F45263A37F692F3BCD2D920E1FD9584350119E74F9A3F905F70D3E20318C1413DE2A0DEA pk = 368CF21C677717560CCC8F67ECA1229229B3D935BF351E842699D8B5CC22CE9B54E6F026B7B9EC41FFE532FA8F3A0F443A87E992642C0D35AB28EA33B70973EC57A1D2F04AB5AD94814DBF30AE8418811D2B07D41E61E79F3A1C70ADD367F24B127DC385D7F9587DF0356D80C6476EDE728513F8990FA8CA83ED73E739E6EB8315EC37C745624E35E95D773D3B50D267359C613662B8720E35247C42578B0DFCF840776D9CF6CF571ECA4DF42A5D65CA7ED1178703FE4AAC2FB3990BB8DB5454DDD245EB8D39FB94F87236EE51E54C59CACF9C261518EF6E4ED4C6CAB78A16E6A9BAE33C71F2B2A824CA9C4D11D6A1F26E1BA1CFF545000E7209A62D80EE0A9423EDFF19A87746A0321C470EF5EB9CF67E33A8FD1595E5F118489A382AFD13CDD2B8AA422E001BFDFDA8B9733AA55DBD85F7BE10326DAAA503C1660FC3995DE89709E90586A3207572CA8FB7DEBA479DFC70F29C4394EE18394A4D17DCAE821601BA1FFB6C7D93364A3CDC98E788D65A127425E3A9D2C6312CC4D9086B94DE4CC3B49C14D31AA7597A55E6B115D0CC178563A30079E9E3BFFF143533576953C77A39D2B9F7C96BED2DD024F1D83BDB7DE79289DB1C4008DDE846AA36ACC6392278E4F3AE79F061857C70716DD152FF665D205904E644FE2E01DB42FEFF776AFF740E1D80EAE4709CF588EB6855AA198439A953E47ADE76D1BBEB38252ACFF9EF4BE0FA930DE459A7A9632A652E804C9A8721ACCBBF2310D17E75B384CE297508C9E9C7AC888F8DC0162F4F2B2D078759E394774F sk = 995EFF7E0D195C6D0533F3DC194D47E60F9AD14696144CDE694D60A95F3E96B4B28F7E7A15A005F92400CE33DB073D49B53871594A88FC45E0F94207B5F0F2DCF1C724CFFE8D40195AEAAE0FBC788403368CF21C677717560CCC8F67ECA1229229B3D935BF351E842699D8B5CC22CE9B54E6F026B7B9EC41FFE532FA8F3A0F443A87E992642C0D35AB28EA33B70973EC57A1D2F04AB5AD94814DBF30AE8418811D2B07D41E61E79F3A1C70ADD367F24B127DC385D7F9587DF0356D80C6476EDE728513F8990FA8CA83ED73E739E6EB8315EC37C745624E35E95D773D3B50D267359C613662B8720E35247C42578B0DFCF840776D9CF6CF571ECA4DF42A5D65CA7ED1178703FE4AAC2FB3990BB8DB5454DDD245EB8D39FB94F87236EE51E54C59CACF9C261518EF6E4ED4C6CAB78A16E6A9BAE33C71F2B2A824CA9C4D11D6A1F26E1BA1CFF545000E7209A62D80EE0A9423EDFF19A87746A0321C470EF5EB9CF67E33A8FD1595E5F118489A382AFD13CDD2B8AA422E001BFDFDA8B9733AA55DBD85F7BE10326DAAA503C1660FC3995DE89709E90586A3207572CA8FB7DEBA479DFC70F29C4394EE18394A4D17DCAE821601BA1FFB6C7D93364A3CDC98E788D65A127425E3A9D2C6312CC4D9086B94DE4CC3B49C14D31AA7597A55E6B115D0CC178563A30079E9E3BFFF143533576953C77A39D2B9F7C96BED2DD024F1D83BDB7DE79289DB1C4008DDE846AA36ACC6392278E4F3AE79F061857C70716DD152FF665D205904E644FE2E01DB42FEFF776AFF740E1D80EAE4709CF588EB6855AA198439A953E47ADE76D1BBEB38252ACFF9EF4BE0FA930DE459A7A9632A652E804C9A8721ACCBBF2310D17E75B384CE297508C9E9C7AC888F8DC0162F4F2B2D078759E394774F ct = 19661E5ADF4C57C8D5DF99801D951B2FDB39B2BCF287838D206B1620DB72E733A9FC92D18D9E5BD1F40A399689F51E2C9392D724837EC477045D21A789AF7A006D26EA1A2E854577DE94FB98BBE0385B4A124042F7DA4372B83A0028E9035703A91B452108F6FA569C88E638C1BF5E3D450CFDCC781A8DAA1F16B0BAA93EC269EB323B2C5AE67A7D8A9F144CB7F01EFA975AFEE0CE5FEF1A04272589D4E982516F5A82D2C2BDC3634892C141A6E9F726B08AB166CF84F4C41BAD562AD452813562ED82164D1795EEC0ACB520256B85E2A77EAB8F63BF5C2AD29F04768A1D7092C078A59ABB5229EF2114927F582CF263EDDDCB38D29E6CE110CBE2C70ABCE7F0E02BE80D4231C00EE9DDFF924C8179AE1B2C763C29CA4C066B5106C33648948FA634935FDAB37DCF2BB6FC1A24CE8DDC04A9FAE39EC28781346E00B610CBFA8A0B9F987257E05392590C62B9C9533C61A9E419218F8C9723F2BA3F43A9DB6EE2D81DC0693FA4BC3E046C9FFA09F095C7F836D6DAF8830B176DF23A9D4E78B8F9D3C2EC76C52D3993276A37D6AD58BFB2067D1F5EFEDD0348D9AA613805F3E1B44091F88B1BDFDDFC0D6DB67D81B4862DE58F98A66990736E88EE92740839411C1C49DA314392F74C15293F1DA163790023F6E4B26125FC4794D1B25241EFF1FC55471E00D103C79BA59BDF4EA9265DE371BC0370C9423BFBA7F56C55D8F3B0026EEAE9CBFAB14151B23ABB6B9A32E513829CC2EEEBDB2E39CA63836E944003076662B93EE46D1254807FE2A035B74D524FCB132454DD6F7DEB27F24D4A0C8F5AD78F5CC92FD664290DE2A45A8021EBC373F451F5 ss = 5E4F7644ABF173038E5C0799C797ED1E401E512FD77C3F6C count = 70 seed = F68FC0314DEA88F66AFAA76E6C9B6804B13D4876924410D1F526FAC59A62E26C560B125B1D0F8B461F1FC2E351EFFB4F pk = 738ECC3B5375C919826513B2A7A6DD0434F22BDC53D8E44FA1623A0CA00025AE47658B5F6C6EE10F2C10C6025B15F90F60510835EA2B5B8D19DF482E03F54DCB757942438512BF259DEF5598A579F460072A3CFBE6DFF2A950FEE620E643C3BE6BF28035A13DACCB0EF0D7036302EEF35DD17BB45CC1A2020D07E0735297B550F7A7FE80FE9DDD7C5B08C7F78CA363375FB7ED3F59EFA9D77DC17F75BBF5CBF404B8873A072C1BC91E360A774F7C11F4E9AF0B040CF110D1F7C3E41A00ECDB23390232A0B7062E1B3FE8DAEE8C308D13110F580D1203FCC56E86946F516D3A30F561DB431F48E911FACBCDD6025B72AF5A0BC2D0C1EBB66770E2459847087296A215C2BF773E45BB2AE0564944A70D97181EAB5A2EC3C709A369FABA337EA27A3425CCB526A6F66CB1DF01C884ED3FE30608A9D52BECB51B474B033037F4FAAFF2E2EF51D2E7FAC9E41DB216AC84BD30E0D9AE7F9375D345655210738421ACB04F38F1B56BEA2653B5059645F85CCE59A04B5A3977F9DE51508E99DE6200B04307FC1ABC3514D1441F10CBCCF15715CDEB72807C8A0D1CA460260D4954329A299BE4483B9B45D8A4331AAD26EB719A6FA05B6344F356C418D86C011DA07CA694DACE41E1733CCF9CECFD40254A43087ACB357C779734AFB2ED813B3E1B0F950E9FDB8B930120B1C79B3AF336B212AB6328FB94F65450E71B42D3068C5B8583E8A6BA198A4051E60A9B9C1389DA81B942B4C41F18662EA1DB749CB2C06BB98FB43E8BC63FCCAEB70FFC44A8C9CD317F7BAAC1614C sk = 3E809EC8DD0FEC0D911A4E3FAC20F70FBB128C5DE94DC7184CA7310AE9157A98D8128601C28B1DEF8D393A0DB283229F7C7383152A814E7CEFE8EF9D9768C473AD3022B265A1EA4CB233CAB79A52FB02738ECC3B5375C919826513B2A7A6DD0434F22BDC53D8E44FA1623A0CA00025AE47658B5F6C6EE10F2C10C6025B15F90F60510835EA2B5B8D19DF482E03F54DCB757942438512BF259DEF5598A579F460072A3CFBE6DFF2A950FEE620E643C3BE6BF28035A13DACCB0EF0D7036302EEF35DD17BB45CC1A2020D07E0735297B550F7A7FE80FE9DDD7C5B08C7F78CA363375FB7ED3F59EFA9D77DC17F75BBF5CBF404B8873A072C1BC91E360A774F7C11F4E9AF0B040CF110D1F7C3E41A00ECDB23390232A0B7062E1B3FE8DAEE8C308D13110F580D1203FCC56E86946F516D3A30F561DB431F48E911FACBCDD6025B72AF5A0BC2D0C1EBB66770E2459847087296A215C2BF773E45BB2AE0564944A70D97181EAB5A2EC3C709A369FABA337EA27A3425CCB526A6F66CB1DF01C884ED3FE30608A9D52BECB51B474B033037F4FAAFF2E2EF51D2E7FAC9E41DB216AC84BD30E0D9AE7F9375D345655210738421ACB04F38F1B56BEA2653B5059645F85CCE59A04B5A3977F9DE51508E99DE6200B04307FC1ABC3514D1441F10CBCCF15715CDEB72807C8A0D1CA460260D4954329A299BE4483B9B45D8A4331AAD26EB719A6FA05B6344F356C418D86C011DA07CA694DACE41E1733CCF9CECFD40254A43087ACB357C779734AFB2ED813B3E1B0F950E9FDB8B930120B1C79B3AF336B212AB6328FB94F65450E71B42D3068C5B8583E8A6BA198A4051E60A9B9C1389DA81B942B4C41F18662EA1DB749CB2C06BB98FB43E8BC63FCCAEB70FFC44A8C9CD317F7BAAC1614C ct = 8A33EAA0A6295968618845F36BDDD087C777DC0D6C7AD832CAE8B04A5D35344F6615DF4D07323EAD5D0E25472C7FD6DFB3DA6A4306A15A17241C7B2ED6D1D4D18A4687550794EA11C54199FB0F55FBA471696640375B20335DF9FC59DA555C9F448C6EC64B7B81EE5A554885EF82C5AF80D5B244DB5675DE87260EA40C070BD20885B328D4013F78D55C5E07843556E3FB34873B087613F96D2D4C2D50D80A1BF49BBD09D5BD66DFE1A1BFE360C5EA78C75057FE451B64D106EA5235159D2C195D167ECB871BD6BF3089873CF4209A5BE8E284795C1698D8FDED24F437324BF2D19F1F8784D4E37D6CF8830BF9406E817414C60B2239E6B070BB3172BE36BC681E2B6ECB7F34543878A585C55EAAE060B14B9B5882003FF5644EFEE6FE52FAAB240B774E4EF2C10482A5BF0817F4AFEDACD0737E27A265D0BDE6971FF9C765017A30B528F7EF2EAA547A0DFA7DAFE0D4533EDBE47EDF10F550CFAAA23C1A66F16C7FA3DFF9F28210D45EE9000262A284D6A1230E81460E0378306F384BC5C30B01BFA9E9CBBBC12E42E72E89A67FCCB19161664C84E935A5C5EB6A547A5B2FA5EC28B3D535C00DAE6EC72234BDF919269034F169D94095A29C3C7FF0761C12003BB9EEA8E87952482E922F2AE8EC9204E092D6631D5F5A73A2E4FEF5C68D83BABB6B6856B7CF3DB2EDEE1D476241758311C5DC455690ED615C91045BC4F7E44B59FF68F66E3E41798747D8DB7B1EDF8311AE3C8890C87C6ED834816471D4C3707FE4E5E0B52F778300AE41A3B1B6980086E48C0453D31A83A06871D225A4165F7BBBE6CDDC3B048A373E887612B8C0524B51EE51 ss = CC68D5CCB759D4E7655F3C2A5D71FFF67740A4B3CFBF9124 count = 71 seed = A229218B0D51F58D915DF549901548FB0722F352C7470900E7E4D8399205764A319BBDDBD06C00E8C5932722EE5A404D pk = A20A895AA0918C363FF02AA418112DCBAA58A2E4451248777916953B4A63E6D829866195CC6FBB0F8951BFB4684D5E102589A48C7216AF7854167CEC559736DE7527788BFF9A5F12178B01CF64CED55B753C1701B7EF6A4352973322731E13C7DF828C9E161196D8FC5D272723ED05BEBDC0EACAC0865711BB4A3F406B1C78395824F79E7FDE7A7D1FEA4CE2E9683356CDD5F3FE1CC430395D1CAE705000F143B5457970758D2E6756A503BD66228A8E209ED2BE5CB5C4818508642095C026873481A86A21D9445D9D89B9561EFA3901A0DD4C74D2D21F64F1C6B5256641AA44B9250A36C638702D8479EB9FAE0D99647071A7B68F8C90F118ED8A86FE7EDE4F15BA00733242A736C5AFBB28F98A74F6080EEAD26499019BAE290A45F53817147A0B4EEE5F41F4C12D1E14903D217D39AE32C108B3DB39F31EBFAB7E1B2886774BB64C5371092EC6D30EAE6F865BB4A6FFCFBD5914944B0BCBCFE0E683EAE8E137DE06DAA86807500BAAFAD9383588DC3A5C995CD4B6902ADEA5C38CE1DFB6B8F8F20398494688C821CE4F68418F7767FCA6414A70837CDB6CF1BC6484652E1C036593D26E20FC4A3C686226B1A6E36A4FFE26B8838930E9CDA2EF4A5B70EF4C74A6FA56E45794FA8311D9BA11390E6DBC4EBE39DA683428D7D75584FE7DDD4FF40A0A780D1DE31645D9BB9751871FE964011AECE8006910741E4EE84120DFEB3163C064DD5A715AB5F7C5D9D922441E99E0487E71833412208455428CD7A02EE11AC4E7C53743768B1D33DDCC4A0BC9B2689250 sk = DBF1C465FFF3D9F783BD9EE61A573715E45691147B8904439B5FFAA64F94FF7BB6D75EAC6C76CED1B0A025B40A55440712AD8424672E761E9BC400D63812006F2EA0901B47297BFEDCEEF84A39C62A00A20A895AA0918C363FF02AA418112DCBAA58A2E4451248777916953B4A63E6D829866195CC6FBB0F8951BFB4684D5E102589A48C7216AF7854167CEC559736DE7527788BFF9A5F12178B01CF64CED55B753C1701B7EF6A4352973322731E13C7DF828C9E161196D8FC5D272723ED05BEBDC0EACAC0865711BB4A3F406B1C78395824F79E7FDE7A7D1FEA4CE2E9683356CDD5F3FE1CC430395D1CAE705000F143B5457970758D2E6756A503BD66228A8E209ED2BE5CB5C4818508642095C026873481A86A21D9445D9D89B9561EFA3901A0DD4C74D2D21F64F1C6B5256641AA44B9250A36C638702D8479EB9FAE0D99647071A7B68F8C90F118ED8A86FE7EDE4F15BA00733242A736C5AFBB28F98A74F6080EEAD26499019BAE290A45F53817147A0B4EEE5F41F4C12D1E14903D217D39AE32C108B3DB39F31EBFAB7E1B2886774BB64C5371092EC6D30EAE6F865BB4A6FFCFBD5914944B0BCBCFE0E683EAE8E137DE06DAA86807500BAAFAD9383588DC3A5C995CD4B6902ADEA5C38CE1DFB6B8F8F20398494688C821CE4F68418F7767FCA6414A70837CDB6CF1BC6484652E1C036593D26E20FC4A3C686226B1A6E36A4FFE26B8838930E9CDA2EF4A5B70EF4C74A6FA56E45794FA8311D9BA11390E6DBC4EBE39DA683428D7D75584FE7DDD4FF40A0A780D1DE31645D9BB9751871FE964011AECE8006910741E4EE84120DFEB3163C064DD5A715AB5F7C5D9D922441E99E0487E71833412208455428CD7A02EE11AC4E7C53743768B1D33DDCC4A0BC9B2689250 ct = 656E653AF48636B6A0EE360642941F73437A73EA5B94E01FC9CB9FEB329CC27D95EE55F8A2180FCC2DB9B433492FA944E16ADA04F91F302DEACAA781C5E9718B41B597AAFE0E5B21B7F37097DE3852DAF5D43D8B7AFCEFDD4E15C3C1476798891D3FEE3586A495CE9AFA9ABC8B856F34B2D67037F1903787251F3F4640F0141EB0F708925F0D5B4AD1977E6EBC3C7735CCF0506455AFA650ACDE456CE0DEC86DBBE2E9B352AF2608645F7B2D15141CCE5F012435A6AC67A120C13F138800D5929CD990B025AE0A72758C2C492AC531FEE68A9647C9DF0441C72FF380BDB6502A0B1922D58DB360855A413B56E42E767BF6B6933652EAAA500FC33895FC69F51396928219E00B61C3AF90AD2FE82A0BF36B8DDBA4D1CAA565AF02AA1EA4ADDCD5B48B666D426464258625C8F63F144D0379BAC6ACCBD383F80B1AF72E48303107A8ADCB35E761FFAFB08933DBF4A3A23B972488054785905B19BC5BD67A47323A751DF190B318FB7E9D835E59D9795E4EB894CB47E83A4C18DBA4F82B2254650C13A21EA780557E21998B5A7791453F8311F275A3C05CFE7B5D4C07BB682472A890173C5BCD6BE8F132E43EAD16D0CF06E02B12A5404572AF012915BEA68844CCFB54A52F7A32DE14CEDABBF55C6BD740C13CEF249E13EFDEAADD45649D46CA325C424439790036548843A3BE8AF8560E77AA6D069EB5E089D1D9F40EA69A6F1F3F08C87CC3F412DFA02B234E9150E76AF9A7CAB62EE845A7297CE6EC89804767A1205E23FD9233D936EBFDC545957D8A854F8124A126A15B81FD63163C229CAF2D875FABC279902B8B093734FA0BA278C1FF042C ss = 630EC3944E3EE27C152AD42A344F92103736B2A9CC27A982 count = 72 seed = 6960F21C7350DCF41B4770C551DC8692D8BA2C0B6E162C589166FF22E7A1AC0F94C2F48504A5F7EB0DA094DF427BC98A pk = 81273BF013A0C95CF5C015381939B5FA5951CDE7D4A7B72B037F016EE649FDB2A2902B24554D1239BD150AFB31721001DD67D4947AF9FCBED87486634F687C132FE3F2493519E6CDFBE4E24E19119E1C03AF9ED8644D0F3FD550D97E246FBEA47F76E64C0C960467D30130ACBDBF1F5DCA34E18BB4E4AA84C6F0AC8789FCBBD101E5357BB45469CED50B2AFA26A4E56FD33CD58E77C59DD3C83AD1DB335CD666BCCFBA2522E9D0EA5F6B749CED62F1619F390CCC49D1406C2F7E2467A270FB19455DC3E634E0B780E72393D681F2490DED1DF664F234AFDB8282A14028DCBECFA98957EA3AA0A7702D04D25C3C7A4AAFF108132731CA73B5B656FCA0D24F9068211972633469D9EFEA35159492D3FEE0FD49312DE08C4B035500B7E8B4430ADC19C64CA1ACDAC6AFF42B8FAFD057044466EBA37E75DBDE5C45E4B21D8D3CBC223305E7C64576863D53E9EBA9C4086912A22A0EBAEF75AE120427F3908F5DAECBCEEAE26DDD34282AD6587D884577DB140D344809B9B0A219D545C1EAEC4B4F4926ACAF7E39211F73950828310EAF9457C821993163156748470C6B6B48F278D924145046097DC194EBBC4C7619D7CDC072ADDA8A91D7C6E8B774A3509FA05BD31BE12B8DC48D433D4E00C43280CD20BE0C6DC0440C5778B606D067F6E9C7805D885CF0FFAD14FDE133F8A2261E94E09C7D0D757CB001592D4BA51B1ABB59F47FB7698FC6EAC356486455775E49D08D23DA14DC0D386E468DF0AF69A5BBA66C1C97CED20E4F74E03C7AFE95971F55AC54CCE15949 sk = 1F7CFD2B70863154E8A69D1758532E86C20CFC763D67C758BD10A13B24E759B5273B38BDDC18488024EC90E62A4110129A42A16D2A93C45439888E76008604C611BEBAEAE425BF69BB34B06612A0350281273BF013A0C95CF5C015381939B5FA5951CDE7D4A7B72B037F016EE649FDB2A2902B24554D1239BD150AFB31721001DD67D4947AF9FCBED87486634F687C132FE3F2493519E6CDFBE4E24E19119E1C03AF9ED8644D0F3FD550D97E246FBEA47F76E64C0C960467D30130ACBDBF1F5DCA34E18BB4E4AA84C6F0AC8789FCBBD101E5357BB45469CED50B2AFA26A4E56FD33CD58E77C59DD3C83AD1DB335CD666BCCFBA2522E9D0EA5F6B749CED62F1619F390CCC49D1406C2F7E2467A270FB19455DC3E634E0B780E72393D681F2490DED1DF664F234AFDB8282A14028DCBECFA98957EA3AA0A7702D04D25C3C7A4AAFF108132731CA73B5B656FCA0D24F9068211972633469D9EFEA35159492D3FEE0FD49312DE08C4B035500B7E8B4430ADC19C64CA1ACDAC6AFF42B8FAFD057044466EBA37E75DBDE5C45E4B21D8D3CBC223305E7C64576863D53E9EBA9C4086912A22A0EBAEF75AE120427F3908F5DAECBCEEAE26DDD34282AD6587D884577DB140D344809B9B0A219D545C1EAEC4B4F4926ACAF7E39211F73950828310EAF9457C821993163156748470C6B6B48F278D924145046097DC194EBBC4C7619D7CDC072ADDA8A91D7C6E8B774A3509FA05BD31BE12B8DC48D433D4E00C43280CD20BE0C6DC0440C5778B606D067F6E9C7805D885CF0FFAD14FDE133F8A2261E94E09C7D0D757CB001592D4BA51B1ABB59F47FB7698FC6EAC356486455775E49D08D23DA14DC0D386E468DF0AF69A5BBA66C1C97CED20E4F74E03C7AFE95971F55AC54CCE15949 ct = 6964EB93C1EEB3CCD4CE5A8B8A0339DAF5BD6773D99A383AB5F7E94D1EDB2CF243AD98279327EEB6295F8F687AB67BF4FC1FD09A9B786DAA92BAA6677DC880767B385FB55AEFEDF10B15F77F552B2AA34FD68CAFE67DE86D51B79C86CE1E2EBA9B919634F7C6E962295883097F7C82D67A0B27C353A06FC1BCA971CF69E5FEC56E2C30B6EF1D01370E3CA9ED4AAD340E4F141549446D7016420F3D570E98DF0F641CB7D81741D94861CE23CD1B87863468C90F5D57ED63AEBC81AA2E47190C7B576CFFEB7D69369F4E656850AF5C5EF56E342F50CB0D1413EF555823EF9652E64BEB13AD14848E2DC62505740111B278A66267CE41145CE6B0CCD39D1851A22D472A23A8AB9D5308CB95DD1552AD44D487AC80C965A165AB7448C2450D86ED3ECADF19DB04BAA21858846AB7373FAD5575D8B6550BB623409BEB8F9776D9E5A09EF9CF68439BA7265471B50E52EE4D50BD1DE8CB2BC53D795DDC577FBCE6E8A768640797DF10B6F3A19554862CCE46634A8945440D9A3C57C1C8DE3AE0F7DF0D2D9673FF676B9EB9831E44347971F221506A0618619138FA85DFD215F916016794EE2B7B0487E467A45970FBAD0A0C41FE97011E8F36E0783D3654F671DAB333971D934CEADB04820AF7EF7E95125367840997C7151DA375E821E6B06D98996842476643467E1DF72F55B34E05266CB00B28B51E2230C76EC9DC2157F1A464404AAB860BFDE890CB4B5A393D9EFFD673CB1BD6A994E75339459BC2AF5770E68FF4B4E9D96AF75AC8D4B60DE51128BD09FDBFB4232AE83F47D1776153A440DF4BF9473E8006E246AD88FBFEAB763F4584DE50B78E ss = 236D8D09E037BEEDC065B488392B9789C2411BE535A723C2 count = 73 seed = 53DF46012CAD4A745B7A3C06E18CA95E0B839FD8161E3025749A0887549EB0ED6A44EEEA08BD6060D6509DBF7E9DC864 pk = 26F3FDAF8054901C547FB65D1F1EB78D13A72194A8078C3C1C187CDADCC59E9F0167BDFEDA4A9F8E37B035A2E004739FDC51C19DAD0412D140298742A0FE5E6E06125CF7D1BBDA3D4E13F05ED7B1BEFDC5930026ED046AF78D5523D7BC3C66E2A999704E1CC57ADB2449736ACF6E40D411272E90E7ACF4737EF80DCA2BC675455FC0F6FBF5E69EA80EFDDDC47039419B41236D9F4DE92879C626325EAA014790E08CFB4C4B9A3EE0BA038215C71145ED5EBF7B4656188C0272466F6CC668E7E3F8261BE3D40536C12780D0F61B525E8CB2605EBF8D693AE502E791F5FD18E200EC2089C101C2CB7078B0DB3117FC505FB9828FBBA2941A3F29AE6B491079D4D6214CD3B709A4EC84D2E1945133F67B9DDF71B170106546076433A9CDFFB88D03071EE908F17DF0788C941FECBA2DFC0076A9CE845246771E2CEB240F6D40D77BE612A410D49908E996F724D26DC86667BF255A811CB5707B2F51212551F8B8D8A945967CFB351B5AAAE548E97C702F0B09D0A44CBDFD6D4E08073C908432B2CD6818EA3B007E1211D1BF01C766DE1CF857CFF9FE36E54342F11439CCAFFB75EF369FFFF31FE5808282081CC39A0E502C7D2CB19C23181D256715B88D65727825394DF47D29956F9CEE90425AAAC128E5EA9D48E7351C3E1BA2F3D8014D2E8A93A105A445986A9FCF306BEDE4A2BD08157A8B5107E502EF49190456B8284F7C90D3D56AC12B85BD3F62B36480811B81BD52C478260D8B4C1FF92DE9DA8605DBADDD57E774498C973A4AFAC2CB5132899D5C996A66 sk = 3A19577908EFD37697B8EDC7FDAF47D1BD3AD01A1B77FAF794BEE5B9C3192A6FA3729672816F3EBA84C9638A79676EEAC0F22C8A48E0C5D50A26FF0844C66B9970C30607EDC2CA4DB2912A5DBB81690026F3FDAF8054901C547FB65D1F1EB78D13A72194A8078C3C1C187CDADCC59E9F0167BDFEDA4A9F8E37B035A2E004739FDC51C19DAD0412D140298742A0FE5E6E06125CF7D1BBDA3D4E13F05ED7B1BEFDC5930026ED046AF78D5523D7BC3C66E2A999704E1CC57ADB2449736ACF6E40D411272E90E7ACF4737EF80DCA2BC675455FC0F6FBF5E69EA80EFDDDC47039419B41236D9F4DE92879C626325EAA014790E08CFB4C4B9A3EE0BA038215C71145ED5EBF7B4656188C0272466F6CC668E7E3F8261BE3D40536C12780D0F61B525E8CB2605EBF8D693AE502E791F5FD18E200EC2089C101C2CB7078B0DB3117FC505FB9828FBBA2941A3F29AE6B491079D4D6214CD3B709A4EC84D2E1945133F67B9DDF71B170106546076433A9CDFFB88D03071EE908F17DF0788C941FECBA2DFC0076A9CE845246771E2CEB240F6D40D77BE612A410D49908E996F724D26DC86667BF255A811CB5707B2F51212551F8B8D8A945967CFB351B5AAAE548E97C702F0B09D0A44CBDFD6D4E08073C908432B2CD6818EA3B007E1211D1BF01C766DE1CF857CFF9FE36E54342F11439CCAFFB75EF369FFFF31FE5808282081CC39A0E502C7D2CB19C23181D256715B88D65727825394DF47D29956F9CEE90425AAAC128E5EA9D48E7351C3E1BA2F3D8014D2E8A93A105A445986A9FCF306BEDE4A2BD08157A8B5107E502EF49190456B8284F7C90D3D56AC12B85BD3F62B36480811B81BD52C478260D8B4C1FF92DE9DA8605DBADDD57E774498C973A4AFAC2CB5132899D5C996A66 ct = 22D56922D3F8D5F6A22F1C28E9A67F4E446452DA231E2014BFAE4B4753779663EE823C5FB260322E0EB5B3E3549120CE252FCC3EBD06A82589A37D9A493E9CCFE186AD2A616FAFC98C48F4CFC5D9EBC4D85BE7BD25B957C50B5E2ADE274B2E5333F2FFDE4C731A1554DE944EC0C61DAD4E97DAA4D204C80F4209DB09DC138F20E78F5F5A1064CC6B9833325F424AEAB2D18CB3528D358327D65C44AC74009A79AAA8056952BC552D4F341A6CFBD5E74CEE8C915CFFDA4FA143C95C3F4341BA5F9E5096F0BEE8A89DF8F0A5353CE53499170C91F092EC1CF64BCE2DE58EC33D5A90360AB76D22BA88A4B21486ED47E463BEC5E017AC99D03092072FACDF25F1D0F3161BE1B78A75E7072A92702F9934F46B85BF179DB67A21512C1C8532ABF963256FC62F3A5819A96CFD6BFCED534F0B8D6872B7BBE6997687BAA6289A355FCACE07A726BC9426D597F7157E1FF3A4EB005E94741B4F7A1A4CB2213744746897C663B5AE1B64E8899127F8887EDA4D13144929C1B229600CE26E3E0269F074916DB5FE3644278EA39D5D158A93F04C57E2BDFB582CA0A916E5846343EE40F61DCF9CCA6943EF18B0D3419F9EA3B70242A4939F44353C9C929B61297B0FA0BFA027150FD2607DF08E98B833664C1892AC706FE50D770FBD82EA1F43FDF661484B1E7599AFF4D4E8C95671760068299D72CF090B5107B27F2C5C2422CF4474D056BC39992EABD53E434D0C0AD1A3E4100482765556903E2518B5F1A6F23393897DF3BFA25FF369D6269F7237351BED8D0F9A660264BE33FC063E585C324C7DE52603C66C5AEE5789CA7FDE5AFE1C12B8750C46A543 ss = 3951D17BF55C2B846F056F4788A68C4F2119AD1222ADBFEC count = 74 seed = DEB963F8B1D8FBDF499D564BA8D2D47915BB402DA02F17031B37B4039A842AFB9B7E48F37200605992BD2429427A7A4E pk = BEF42A6EF62DBFFDA2C4827DB57C8AB6C5058FBAFFBE139AD52838433B28D8CCC09733DF15D79DBE4078EE51F6C58100D5D3CFB9026E0DDBC900BDA86FEB0D875E2B6CFE1CC1D25B96C331DC04E68CCD3A88FB7AD3662BD7160F92E90042D691423E9BCC86E92E9588690F27F11FA366944666A8FDDFB9BF6374C8570C241F020C902B8989E3489C0E5A6C5DE79E0657D3378F4D8585049ABEFC1A08282BA416FE9CE77AAE96F6CAC91F41D2D62F910EB2E069A9A2A92DACD01C9C2BADCC6C5AABA809F5B433A28C689E14F5463CD736A21E73ADFA19872155F67C3F310653DE165BA5E6B0B803FC6A41F5F02FD928CBA355D546ACB870027F4117E09D31161A3A1BD8CF61EE98D348D98FB381466421D8F958F50C5C1135231F8919266DBB6D200CF8C47DEEC65FC88ECAFD5C527940FC1F67BD341592B13DBAB1E3F355F616DA594CD0315E247F609BA5E6A96F86582672BE0559EA90139921AC11686DFB2219DFF1AD27E86DB224A3D29DDF81CA746170A0562826865EA195E89EDDF94452E821835E49E5BA9A7F4927F3361EB0291A0F5E023842E6FB04A6DF273C3C1D692DBEE21D389143E2DCACFCB6D424A1CA308A7EAB3B910D698D16F84400DE2C5415079786A728060C51C96890D24B12D12BE016F9A13CAF9FD8A6F482019F397E75FE8DF520A0621CD52FC239D82D1DCD88C44FD16DE713D87F4500A0FF7F6E41A9C1BFE6B2657696CA73846FE5AADBC7DA3BC2CB6CFF6AB24BEC98A375BC6BF52D2FE61279FD33C5F979C370D7FD14967838E44E sk = AE0F65E29F38804A6759F70F4D01E2AAFF7FE1C91EBC4F892DD0DE3AB2E68EA5E03FF73E02A217659F53D8C47556BF3D8C94040F630D63605E2D0F923579370C95E08D6CD768BFBCFEE1CB565A2CE803BEF42A6EF62DBFFDA2C4827DB57C8AB6C5058FBAFFBE139AD52838433B28D8CCC09733DF15D79DBE4078EE51F6C58100D5D3CFB9026E0DDBC900BDA86FEB0D875E2B6CFE1CC1D25B96C331DC04E68CCD3A88FB7AD3662BD7160F92E90042D691423E9BCC86E92E9588690F27F11FA366944666A8FDDFB9BF6374C8570C241F020C902B8989E3489C0E5A6C5DE79E0657D3378F4D8585049ABEFC1A08282BA416FE9CE77AAE96F6CAC91F41D2D62F910EB2E069A9A2A92DACD01C9C2BADCC6C5AABA809F5B433A28C689E14F5463CD736A21E73ADFA19872155F67C3F310653DE165BA5E6B0B803FC6A41F5F02FD928CBA355D546ACB870027F4117E09D31161A3A1BD8CF61EE98D348D98FB381466421D8F958F50C5C1135231F8919266DBB6D200CF8C47DEEC65FC88ECAFD5C527940FC1F67BD341592B13DBAB1E3F355F616DA594CD0315E247F609BA5E6A96F86582672BE0559EA90139921AC11686DFB2219DFF1AD27E86DB224A3D29DDF81CA746170A0562826865EA195E89EDDF94452E821835E49E5BA9A7F4927F3361EB0291A0F5E023842E6FB04A6DF273C3C1D692DBEE21D389143E2DCACFCB6D424A1CA308A7EAB3B910D698D16F84400DE2C5415079786A728060C51C96890D24B12D12BE016F9A13CAF9FD8A6F482019F397E75FE8DF520A0621CD52FC239D82D1DCD88C44FD16DE713D87F4500A0FF7F6E41A9C1BFE6B2657696CA73846FE5AADBC7DA3BC2CB6CFF6AB24BEC98A375BC6BF52D2FE61279FD33C5F979C370D7FD14967838E44E ct = C561FC551B49B035A0D71ADFDA9845133C839286FCE594E984A9D1B76180E71E760D72DA085DCD04C3141B2B45AA01081427FDDB991C8315C365CFAC3856A31563A69499ED2CBF725AC1B8C39FC48E0F5A81FB1EF6CFD1D9F1625CBC2F6D221E605160EC97C47A4F6DB62D1E931C574D5DA744420599A915835EA779F0059911B030DB89BDD24222F7D3BCC4CEF90641DE735BEA2D2BC59586E1B639BF5EE8A8DDF8105896E01CAC429D8B7C3BC8BE673421FA5D255951FE28A17111BB01CC1C73F931486C7E3B69709D4D84FD1E129DC036348112A45F2C5275DBB7996B50E1003F04FDDE89DE04A3C8C067CA516E2ECABA2AACD6837BECDB9619D7136AB67FE8B0C88F6FAEF2E4D125E127D9377BF4118D7227AEE807E247367579B20476668A76450FB3F6CCF1AF244E7FCFAA553A733C05F414C2234E22DA1663D425276754AB31FD55AA3ABA35F50DA8EEBA2AF4DC61F64B9799B13295967D9A043D38E9012CF1AA887B5050D389E60E7503CC2C6409D8B36F7A456D1E743B477A8E0786163EA29D5D981A5C89DEDE0BB2067699154289903BC73966CD5227047BFC50026A7D7A16C6A26DF8CA290983216B1785BE74058C50F388BAC47980F8FCCFFBC7E85D7A72D8B57D337B2AF187B91292A9CC716AA3A42178F7099EF113826929EB50ACB6EBCEF0A9B437E206211D914A4E97B4875B6FC75E69426ABE2BD6EC172EAB44A7F5F89FEB9E4F0B3C2DD101C5A253EA5C92AB981FB733C081C5E8BB1F97FB14B5B429A7A9B5F3DB8A3AFF05C11E6EFDC042678D7D950FDEEA8036BBE3FC18B3C17DFD1DA83328EBC586400FEB84FE50ACDC ss = 6E7B0E63342C5EA3E2C9B96A083E27B1541432F9722A1675 count = 75 seed = 8E2995F1B3E43853B18916BB1212ACEB05898E2B177A87ABEB928AD7184E59695C56B2CCCF5DB80853C28A525E327D13 pk = 1B01B91B647F1342DB6997E67E008FFB00698FC71BA14A1AD9EBC864E73A8E5DDC63D4FC72A76CC298952EFB1E90D20EF1D31AFE0D530DF88EEC58AA7CC7EBF8EE518ED0C8ECF79E5B3FC9D297B4116A43F35EE157FA51D19DE221F2223D1E57F9AAD1D138B0F017F982BB98091DF656976C36A168800660AD4B2129A0F9FDCE73B389F0CD6D9B3AB5633A437222B817190E620D3AAE9CC8F2F33A4082B07326670F17F528E415721FD69B682E8B947BFA56A121AF03B1AF4EDC7A6304C48A91F283978AAD70107023D8708F64FCCFB580140B8EEF48D32F9D05A3D7274C3F3AED04A242C24F8B307B456D7B0784293093D8188035FDEF10A62B66456124093B51E3E281A37A609F28649EB85597D9C16A862A9D25FBA72189488AE2B227DE8EBAA669245572D6567901D3693372C48B22E763AF62495D8629153145157C3C9B32F2AC6F3A77F1A6CF2348606B9DB83C549EC8A36F40484A5D2F4926BDB7126F8DB9683DB055C359DD067413FC14E339BD816231388DB22978A8F14E6B06743035AF7B0B6CC11A5CDEC3AD901E6EFA259DF55F2EE899B290B5618DD1F37FD88DF7342EDEFDEF545D00545F61F7CF0A35F8158B627173897B779448F8C960BF90757DED596489C1E7CB08D182038D6BD4C4AE0FD32E554593BF35F2827C272F1A78869A1C6C8484424FA58AEFB9C7D7CE43A8CE3BA01FEE30CDBE7C6829EB0A15D8260A0666D65CF18B5125B190C9D09FBB51284C81F6F5F7AD5D6D1461BC1DDF5CA96BA298EA2EF29006A89DC946C906534AA33E sk = 6084A235F79DD093EF6D185B54E69DF33DACEE73A9BF2F379004421A10E3A79D9F684FB055ECE19459EB464E91E126A7A6E3ED11CCEE0046DA234D964C9851104A2A81136C9568A90022AD41A59170001B01B91B647F1342DB6997E67E008FFB00698FC71BA14A1AD9EBC864E73A8E5DDC63D4FC72A76CC298952EFB1E90D20EF1D31AFE0D530DF88EEC58AA7CC7EBF8EE518ED0C8ECF79E5B3FC9D297B4116A43F35EE157FA51D19DE221F2223D1E57F9AAD1D138B0F017F982BB98091DF656976C36A168800660AD4B2129A0F9FDCE73B389F0CD6D9B3AB5633A437222B817190E620D3AAE9CC8F2F33A4082B07326670F17F528E415721FD69B682E8B947BFA56A121AF03B1AF4EDC7A6304C48A91F283978AAD70107023D8708F64FCCFB580140B8EEF48D32F9D05A3D7274C3F3AED04A242C24F8B307B456D7B0784293093D8188035FDEF10A62B66456124093B51E3E281A37A609F28649EB85597D9C16A862A9D25FBA72189488AE2B227DE8EBAA669245572D6567901D3693372C48B22E763AF62495D8629153145157C3C9B32F2AC6F3A77F1A6CF2348606B9DB83C549EC8A36F40484A5D2F4926BDB7126F8DB9683DB055C359DD067413FC14E339BD816231388DB22978A8F14E6B06743035AF7B0B6CC11A5CDEC3AD901E6EFA259DF55F2EE899B290B5618DD1F37FD88DF7342EDEFDEF545D00545F61F7CF0A35F8158B627173897B779448F8C960BF90757DED596489C1E7CB08D182038D6BD4C4AE0FD32E554593BF35F2827C272F1A78869A1C6C8484424FA58AEFB9C7D7CE43A8CE3BA01FEE30CDBE7C6829EB0A15D8260A0666D65CF18B5125B190C9D09FBB51284C81F6F5F7AD5D6D1461BC1DDF5CA96BA298EA2EF29006A89DC946C906534AA33E ct = 77F1421002FB5F7E55237071EF47B7C9C6B73D31EC84F70B764BD86927CFD2FF71CD1708BFFCBBD4C0566737EDD732E3568045F3D803969E6E7CDA16071938BD0AB6AF4FF47F85AAA09A8E14DD85903EAC37D4DCD0501A4F87CE113E0C6B1DFA317B8E3C2835FCB14A33857745FBEFC6F424FB8F56A421C6FE5630F4BB04E4BA9E191F85D639723A56F8DE33B86F6A54A7FBBDEEC32C2E4C887FF67771B7D56654FF1356AF75A79A440A2D83F547E12C21C30E3A783542A522FAC13452EE9E56DA15B4D12AF37FA3D8E4E8571CD66DB26906A5FDFADA7F8732E184BC2B162FF84A4354FBB8E630BDE184E5F3A3B0157E25AC48A41E9141BB98101A03614743445C62879D9A018BC67ED906EE9A15D4775A48F1CD8476AF1B4A217C62B22CA7EF56DB2EC362C33B0CE823B441F9F264028A6F20156D633E95FC03334140DD049491A4B79BE7624B9A7064E4B708F740D83C3D1BE8A65DFC3BE0A5998566A4DB7DD66507C5FBF88C354CB4641D1236C58F5BD5DAEE6FCACA1446F5A6815C7199F16F21AD65FDC601FE8CC872B5AC99C852D62386EA710BC76D9B38AA98EBD8D925993A1DD2C430D6CC2EFF1644DB3A2B679043AA8CD6D1E288B67135BF7ABF6328E0448568E88907ABEF8035799AE1FA402F9ECBB6FE6656E297BC1AB29BAF0AD392B112CC8E0EA98B2D7603A236C52A30FB06D0DCCF5B0C5CAA05F8E36CA0CCB2DA5D9B1205B781C8EDB1A389318306FB7F65F84EBDC491ED985859D5ABD1209065106AA939C25871405AC09BFE58F697200E5E206B4F40416EFB04F1EB843D1190DD19C73510D0B2C4B73CC7F56A6B78EAF98FB2 ss = D7959F1F8758ACA3BBFBA18E933895470C165E604769F7D8 count = 76 seed = 9218943C51FD2DE47E509AAC67EFF176795102F37D7A2017E3AFD768FCDA7877AF38739B00FCDF227C2FD62EB635942C pk = F433DF0B41D4F4E9578E012AD60D417CC0DC067DAB40F7AD8BDF592082862549DC4F85A093082C129FE8F3A83A58B3B3916464536BA1E01AA60840B7B38DD7C0296E0C6F7AC310C43D49DC9AEAB6E26D49FF3306C348805B610E840F2A1745A43D87517A22FC52F06798567E927C0FE7C780499746D76E41F145C1AC6DBD38E62D318E8491F85263DBE21890CD1A37BFB8A4E89DADB84E0735FE6983AD7DA293E3B7AF3072FCCC261B5FC55BD827FAB83D1248767689FEA6D6343801F9CB23F0051543E48AE650D44DD3524EA20FFB718CD86B53B21ED179D4EA761A9888C0430D078980EA50295CAFC476557F50F0239FCBC8D13D311FDF94E1DDB01AAC6D3799409E034C44D1012DA641BBBEB84DBFA0C9489D1EF67A82A168DBE3D27D45C7D005B3CB83BD8AB8DEA6008289FE40FE2E8F83DA3424868DF710B1245F0D0394F4ECCBC8DC5E7927BE833D72C899FA1E5A7B233A50B9D88520D74120FAC43C949582BA67957A5140D55A055780EDAD2C27DF55FB84FBDC22056E966A64575CDC54AB3E1009C3B95E18E3340BEB971A9AC5B7840C7E0B680BBEF6E83C7DCC01FE101DB875B7EDAA5685700B5FFDD7BAF63BE474B40EB4C141AABE40F60F0C883B45E247F2C8AF15D8D98B59B17BBB51FA6B06D391F02DD324E3A20EEA78A5FD394EF6F933B678BA11AF591C49E766F53C3CAFDFEC9B42BA4C49492B88F72B7BC0DA28DDE5740F7EA78497D727EA1590A36CF5451D599F269FE46F586151CEAD602F0A357AE4BF5AFCB53C5D768663D4B3C0CAA143 sk = ACD1C0217FAD5CAA4235544DD9DE153AB1880CCF4C76F16F236FAE4E4BFDA04CF03A8ABB0A5010F400AE5722A75BDF5A2F6D5B546B34D73857CB1BFC7E587AA73EFECFB5A325BE44FE5C5D3C4062BC03F433DF0B41D4F4E9578E012AD60D417CC0DC067DAB40F7AD8BDF592082862549DC4F85A093082C129FE8F3A83A58B3B3916464536BA1E01AA60840B7B38DD7C0296E0C6F7AC310C43D49DC9AEAB6E26D49FF3306C348805B610E840F2A1745A43D87517A22FC52F06798567E927C0FE7C780499746D76E41F145C1AC6DBD38E62D318E8491F85263DBE21890CD1A37BFB8A4E89DADB84E0735FE6983AD7DA293E3B7AF3072FCCC261B5FC55BD827FAB83D1248767689FEA6D6343801F9CB23F0051543E48AE650D44DD3524EA20FFB718CD86B53B21ED179D4EA761A9888C0430D078980EA50295CAFC476557F50F0239FCBC8D13D311FDF94E1DDB01AAC6D3799409E034C44D1012DA641BBBEB84DBFA0C9489D1EF67A82A168DBE3D27D45C7D005B3CB83BD8AB8DEA6008289FE40FE2E8F83DA3424868DF710B1245F0D0394F4ECCBC8DC5E7927BE833D72C899FA1E5A7B233A50B9D88520D74120FAC43C949582BA67957A5140D55A055780EDAD2C27DF55FB84FBDC22056E966A64575CDC54AB3E1009C3B95E18E3340BEB971A9AC5B7840C7E0B680BBEF6E83C7DCC01FE101DB875B7EDAA5685700B5FFDD7BAF63BE474B40EB4C141AABE40F60F0C883B45E247F2C8AF15D8D98B59B17BBB51FA6B06D391F02DD324E3A20EEA78A5FD394EF6F933B678BA11AF591C49E766F53C3CAFDFEC9B42BA4C49492B88F72B7BC0DA28DDE5740F7EA78497D727EA1590A36CF5451D599F269FE46F586151CEAD602F0A357AE4BF5AFCB53C5D768663D4B3C0CAA143 ct = 5808752F48C187A8C86C9FF5F2AA34712C205CEB96B26B86B59FD1A679123D50647EC04986D79A05D39B4B60C418904171049D3246ACCD30E0114B1A76EA2AA3C5C272D6E66CE53E507355CBE59D82708366DF409DE3E38A923E6774E40B811476DE4AEA8C00EC3FE9754406E9E3BE80C4BB2D60889AD1F92F8317B0B034FAEBC39C3C2A1C2065042EFA940932E3C70A893E673A0B17BEF8DF8FF4C3BD5FFB83BBBB69C1DF891EB021A6D1560F7F742A40D87489F285F052AED2343C33AE940CBB2305C05EBE8087093E7E62D400772DDE1AE220FC7908C94E670EF31E302743A48D40B19E914F4373A7EFEFE5EE7730B9394124A3B2BEFBC2A4721C62677454DB6FCF176CBA73D8255704471DA7A0F8EDF506C5463C77EBCD5B042BCCF1FC5AD6DB983B3E523870A0F93FA65B56746082867EDFCBEDEEFCB3014F34D19814D72D1C8A26B4FEEAEAB984296588EAFD496541B9FE47D3E4FEA5A87105438B2B7FA64E20D56127CB69F3435AC19AD91355F68663D29D152B22F1E6B2118DE832E9CDA7A3E60D8F335ED5B319219EA520173C4F5BAE45BF066C7FE09F263ED4DC6E5193B44ACE38B160D4649F6DF64030B440DF0D19D017ABB4AD0A3E8DDAB9309DDC22915771D5E05988D3133899C1180A628BD5ABAC59354DE460576559AB2AE0B0CD185F40779D7A2D7F8A500E9CF75FCF85E00E9E827C844FEE18CACA9C19971BF4CA056BF0DFE01823FB6B25022CCCADF09E80F017968A34A17DA217A3C7B48A123D88776F205B4FCB7A65875DD37037C86D6FEC74ACF5F747B02DD1714B828BF5F7B7D73B170E7B90FFB20DC4ABB03CB99AB1 ss = 953AF773291A7DC43F827BFF3A4B0FE97204EA323E669BE5 count = 77 seed = 542E20078ADD5296050AF150360F057F6B9AB3BA835589DD56987DE805F900B906505B5390A0D86CBA28038992DFC59A pk = 09DC4F77D6AADC81DD76BD97805AC1F21958A88C405C776A7393B70BC4DCB212B6B9074B2679154E259D539B4A1D06DCB5205B98986CEDB30A92C72D5F8F8380919F522D2458958EB8274E450013F146C350B3CBAC6AC6849EB7AE876E5EAF6AD0D671C81F77228F76A0C5AE1B750B900754ADF9A51282CB366DDB1683F7238C50BFF34808E23DCEA866FC4EAA940BCDEEEC65096BF7BBEA1FA61DBE782600AE8DFD2D5E218ACB63A7363F83C216738AC84AA7D07EA8CA1F10A6955A2553610A52536CB021B58D876BF86831ECCC9A00E45B2F143FEC7459F4C3C1B65F9E5BBC16176860039C1A4C1528EA11EABFAC3375DAAEF79A776F2DB394D93779F1301A81FA0CD1FEEF282603C5C4AEE2619EBBEAD7B919805DF8452B25BDE2A23EDD72D0C7BE91103FD4F47BACF7EDCB979D6DC244DB061E1BD1918AA7BC57E74D4C6E31371AC78D81C382D37DF8EE4A7C8B346654D08D1595814F6E8F52059B859CCAFB0016ADF83B4CD1723776855B5723FCB2B06D43DB4F8747D46572314F71FA24B901065F7697E506A1794DC6F33C5D2D3A8B0FC8C5A60E12B24CFC0871D7CC942E9DA944976A48567541326561BEE0D6D82834A3ED44EF2DEB67FA7EA759FBD084901920AEF3C8044829AFDF738768ACDAEC50B97E54D4B0326EFF15A3C831D38A687EC7454293255209090FF969C482AE77B12C0C3330CB59A4EF455839A0FC8072FF6DF4A899F361D07E65E024DC2B7A66CC5800240140FA5500D7DFA516BC551EE23B63EF7168E3936A6047A1242D18002816 sk = 241191401A63AFA750F05662E354DDDBC683C776CE3222BEB83E3CF913D7ED7CA59B3BD23B49A95BC1FAD20070FEC930B6060BD827D742B077092E422268E15D85112C0C2683DE1DFA7719ED7F49880209DC4F77D6AADC81DD76BD97805AC1F21958A88C405C776A7393B70BC4DCB212B6B9074B2679154E259D539B4A1D06DCB5205B98986CEDB30A92C72D5F8F8380919F522D2458958EB8274E450013F146C350B3CBAC6AC6849EB7AE876E5EAF6AD0D671C81F77228F76A0C5AE1B750B900754ADF9A51282CB366DDB1683F7238C50BFF34808E23DCEA866FC4EAA940BCDEEEC65096BF7BBEA1FA61DBE782600AE8DFD2D5E218ACB63A7363F83C216738AC84AA7D07EA8CA1F10A6955A2553610A52536CB021B58D876BF86831ECCC9A00E45B2F143FEC7459F4C3C1B65F9E5BBC16176860039C1A4C1528EA11EABFAC3375DAAEF79A776F2DB394D93779F1301A81FA0CD1FEEF282603C5C4AEE2619EBBEAD7B919805DF8452B25BDE2A23EDD72D0C7BE91103FD4F47BACF7EDCB979D6DC244DB061E1BD1918AA7BC57E74D4C6E31371AC78D81C382D37DF8EE4A7C8B346654D08D1595814F6E8F52059B859CCAFB0016ADF83B4CD1723776855B5723FCB2B06D43DB4F8747D46572314F71FA24B901065F7697E506A1794DC6F33C5D2D3A8B0FC8C5A60E12B24CFC0871D7CC942E9DA944976A48567541326561BEE0D6D82834A3ED44EF2DEB67FA7EA759FBD084901920AEF3C8044829AFDF738768ACDAEC50B97E54D4B0326EFF15A3C831D38A687EC7454293255209090FF969C482AE77B12C0C3330CB59A4EF455839A0FC8072FF6DF4A899F361D07E65E024DC2B7A66CC5800240140FA5500D7DFA516BC551EE23B63EF7168E3936A6047A1242D18002816 ct = 4631BE48B574078486287D9FFD4A544C15EE195B5252F36E991B9A591BAECE800DFC6D2D5BBD53CBA2080C451C7B223AB87FB822DBB319C6E0CD9E77A69362AA9155AF153E0D9BA211D4F9598667CC1CAF29C1C4A239732B62F072892A5072B76CC4F3E4100ECE3ED4BB45ECB40C0990F29BDA3017AF87515D1279693E7DEA2CB1FBBE752D2877E00D62FABB2B6B81792D23FF141E64BD7D6414A4629484C88CA17668337A7F56FB17D577BA1D4F0D992FA11905F10BD01D92C3DC261A99AF443C305B991966FA5266F8CA60AA8A2160D7DC10D984F12003405E7CFE4EDE4A54AD20BE8DD3D530D15DBDEE547CD30EE6C91B2AD7EAC95C7AA567FBC4CED8FC0279C4C70EFF66FCDCC15F9A5742DC9718AE6F2AE61BC808EE991D9B202D8C0928D348E952C6F86455AA0655454C5DF992031F14C866B4669C6B93F00E8E87C1AEF764BB240E4604F8B697761D74261B6DA2A95032FA5AD3E3A9451EB4C575703F3303E828EF2F92EE85A1E0B87D1A0245944252FF12BD805C61E837CD610A5271C61ED0C7D701E2835B1B9FCCDF8745E2B5F2603E9B26A3835A80583D36993E97E19499F6723F089D56B5CB3D3611CA0C43087318439B108FB83E41BABB9DC89D556A5B8C7B27E491BAB41B0292BA7E794BE3F8F62C19A6CF9FD721BF42B3B3830342F1D34C16D5D8382B1C6E7252701E84D09A7EAE663919589B48F968FA49391AD0D4ADB149188A7F998AAF34C6DDB428389BCF81741BCE625BAAEA27AF96F6107A36A370FF36F33FFC9F51B1BA0A0B23ABF340ED26A303F4453C3CCDCD06BCF69649681608E5A5A332CA303ACD613C0F8E5843 ss = 952598320654D07CB5A636DED3EF33BBD8FB29D9B198CDC3 count = 78 seed = 6A85A61DD08C0733FCBC158ABB49FE0B0D96A50DCCA140A2E9F5A254F1901985844613B1C656C0CB0112620591B88AD0 pk = DCCDEF8BB0433150CB54D7965861044E22B4F1CE3AA72AE1BB33170A286774B4D93EAE234B6C94C79DEEDC0DD2986982B34A78C28A9CFC5B51E115D156A26779E1CD65CA3214D135AFEAEDA3BE9FD94DE8CE3C16034E1CB940B5C795A1574407195D6E54A9727EA252E4B7F5698AFA1298FD735D4CD80496F8EA278230E6E56D8ADEEFF889CF395178BA7CB3DEB9C4186E965AEDC68B822BDDD8EFD135EA46A65237585AC188589C45FC9AC0CB541E4879F14A06C5B1E58C112684045276C38A5CC119071762F4217BD6AC83A0ACFDF0EF3FFE809EB30BEFD44F036EA821133C8103387316C2FFFF04AA4980A7186D3C10E269670629222611B2655B14AE75B11825A9A08CD08DA89151DF9479E503F5E606A0D00629CF51A156C6ACE51ED1C27E2612755C47A9C393869DBD4B7C3C49A33567254DC6C8D01C050CF2E525B828EA991586570AD07752E71F87ED4881472CBD9AC9A32266A787EF615885795450EE67CDF42BCEFFEFCF34CA801A05A3876B134F676F2C716B0173279EB503089ADA76828328F9068F67618A0B5BA2CAB6196CDDD3D63763713B1AD80621C43043F08E4A5329B2C4C91D392AC11D97DA8EFC79A01170FBF2846D73107B924D78C056DD0389273D397C11D926ADAA40036EA459300A9D12E8251480F1253219A93E0FC12634A3548B48C8297E3A92384D67746C8B679446D3ECCE6B9749CBEE1188ED12A51C56AA68B0D25FDBA0B4DA9C1D4DA9F2FED79A7A5DEABA74BB5ADCF07C687730597C628C18A489A708F9C3AFE7AACBE46B sk = B9A6B0C05677E957D41A34BA03BD06F2A9092E31F63389397D7E70FDE6409D18E99C0E7B82BE89BC3C1EAEE6680AA4EFD394E40C2B3F30523C8117F7C26A8969B6E72DE77006189ADF35F4EBE05AB703DCCDEF8BB0433150CB54D7965861044E22B4F1CE3AA72AE1BB33170A286774B4D93EAE234B6C94C79DEEDC0DD2986982B34A78C28A9CFC5B51E115D156A26779E1CD65CA3214D135AFEAEDA3BE9FD94DE8CE3C16034E1CB940B5C795A1574407195D6E54A9727EA252E4B7F5698AFA1298FD735D4CD80496F8EA278230E6E56D8ADEEFF889CF395178BA7CB3DEB9C4186E965AEDC68B822BDDD8EFD135EA46A65237585AC188589C45FC9AC0CB541E4879F14A06C5B1E58C112684045276C38A5CC119071762F4217BD6AC83A0ACFDF0EF3FFE809EB30BEFD44F036EA821133C8103387316C2FFFF04AA4980A7186D3C10E269670629222611B2655B14AE75B11825A9A08CD08DA89151DF9479E503F5E606A0D00629CF51A156C6ACE51ED1C27E2612755C47A9C393869DBD4B7C3C49A33567254DC6C8D01C050CF2E525B828EA991586570AD07752E71F87ED4881472CBD9AC9A32266A787EF615885795450EE67CDF42BCEFFEFCF34CA801A05A3876B134F676F2C716B0173279EB503089ADA76828328F9068F67618A0B5BA2CAB6196CDDD3D63763713B1AD80621C43043F08E4A5329B2C4C91D392AC11D97DA8EFC79A01170FBF2846D73107B924D78C056DD0389273D397C11D926ADAA40036EA459300A9D12E8251480F1253219A93E0FC12634A3548B48C8297E3A92384D67746C8B679446D3ECCE6B9749CBEE1188ED12A51C56AA68B0D25FDBA0B4DA9C1D4DA9F2FED79A7A5DEABA74BB5ADCF07C687730597C628C18A489A708F9C3AFE7AACBE46B ct = DF648211D2E9C4A41D9FE2C6ECAC41BF0D08516B86FD0D09F113B6007D2436BDA47BA871942BDCB95463CB17C6AC211E273911BD39E54AE2DCD22D08F300D6FAA0940EF416103E6FE2029D685C1FB7D0EB9AE837BC840F8FDE21177FCF3DAC80513B543F93EC971614EB5F32F0875237F6EB72589479239C644D2CFD2AE8B825F8E4BA86FD208107B8A8C3502559D752AE6695277C664356C057E7CABC2C854171420B59D709DFBC257D1CE6E5C87DD3F4B587F7E77B9E13E5B0CE1210B44A610A1A268A0C42B4B026CEE77BCFB1AF4D19A2B8736A50B30104C0A57E013AEE6F7ECFA8416EDE3BD18A13EE54CC25606E5B555E7631AE747E87331FBFBCF07302D5B8F6D4260C4FE5973791DA3C519AFDAC6F1256CBF95D47850059AAE05D1E6C6A1199B930CBB94BB6884818418143CED039A8F323D2B9F87876962E419623FD04091E4B4B72D7FACB842FF696D12588F851C52832A5813AAC2B32AE63735D0E8DD88F12858FEE0DADAE8EC6AF8EC7FDE0634D47AA67266176B2BF66587F0CAA24BA5A1D8B2520CE4CC9B056AD1884F3F71739A7FE20791C9FC4868CD1D20B031B35BE81A4DDD03385F24E1E00ADA52ED969CC236FEC4036C4E224B39D9DEC3A7D34BD9097B2BF9E8FE667E1F9A662E6AE5ED50969034068A3FB3D966B3F563B90E50D307DC867ECFA18F93E408EDBA774C69C5C478CEF9A007720D333443AF124D392BF80FB8C5015B3C98756E4994CF7FFD77C6C4F18043DD260406339EDF4F1273007DCEFE7D2905BDD599579B3D0BB3F0312D4A796626BFEBF8F0F7574476A54BD0BB93C3FAE4CD884417BE6AE70CA06E6CD ss = E482A8A18D776FD3A6F2122BDB741512F2FDC5193514B6B2 count = 79 seed = 7F4A56EDA151E7B097CFB8EF980440FFF707AFFBA91867C89522CED6C5FF3BD7F5F00BB49DDD615D9361A7E4EFA42851 pk = 7074456915418B1165D320CEA4801E0F4DA3F7D547473442045676C9EDD2A7AD1AA6FF029A957C93CCF49858B5ABEEA911557213F05C7C7D253C005E9657CF7C41CD6070E68F39FAABCB99077425AC750DACB1FC301EB91858055F04442E8A1C0FAD1A157ECA7D29F68C23720600433752EEECB33527BFFDE2203ADF196171CB4E9BB68DF91C4D7C87740A031FBE84B0C3C2F0B5CBB5ACFC4D9104DF1B58274A48D341B1495EF4CF54CC5B89F1AEC65DFBFD30B2E6B87DC9F1118562C63C76251C488305970308C814D8DFD3C4AEEAA3A84968DC66F32DF3ED54291E3C6BB0BAA199EC170DC6FE3B66AD6A81AB73D49A056DE3044F24B0081BC187571A7E031C41BD34B3940B920B06222368C79624C24F031F75E04607CB64022FBBF82112ADBFA7D91356F5DE0A37BCDB069F78197CF9BCEDB5C47A8B9851A90FDEF436E7FE6F7F7EF71FA693A24FF6EB84BCF3983D3AACDDD9ED8EB8621384C9D0CB4AF58F56A231CA1B70968958CCA9691AB8FB7944FD7BFF77888D632E7BDFD7177535F9B5CBCD02C95E858D0C6359A2F851125869152DE38B081E02025F74B581B8281436D1D98DC08DF4CF7C8AACD18B4076AAE576216CD47443B812B1013B8581E254CD892B6ECBF3CA14FF992BD8453B31847351E266890539C309CB95859F4C8A434375C8B10B721D6038D525B08AEF592426EBED410BB9F2FBE5D6E22F0687B2CC93C9423FDBAAA019B5437ABDAD2335BC34FCD769C79C479813A6023B2DF5891FDDAF720B684C0D3D97ED65D224A15C83D8E32841 sk = 28A96C71577BA00C94F99FE965BC595A26DB2B3CA6AB5CF8E443CDD8462B17929C35D165453E5FCDC6F9DF64526D9DE698F2BD3E6BAC6C7FDD86601B9BA5F4A503F3E68011F266F54BBD60DB0F99BD027074456915418B1165D320CEA4801E0F4DA3F7D547473442045676C9EDD2A7AD1AA6FF029A957C93CCF49858B5ABEEA911557213F05C7C7D253C005E9657CF7C41CD6070E68F39FAABCB99077425AC750DACB1FC301EB91858055F04442E8A1C0FAD1A157ECA7D29F68C23720600433752EEECB33527BFFDE2203ADF196171CB4E9BB68DF91C4D7C87740A031FBE84B0C3C2F0B5CBB5ACFC4D9104DF1B58274A48D341B1495EF4CF54CC5B89F1AEC65DFBFD30B2E6B87DC9F1118562C63C76251C488305970308C814D8DFD3C4AEEAA3A84968DC66F32DF3ED54291E3C6BB0BAA199EC170DC6FE3B66AD6A81AB73D49A056DE3044F24B0081BC187571A7E031C41BD34B3940B920B06222368C79624C24F031F75E04607CB64022FBBF82112ADBFA7D91356F5DE0A37BCDB069F78197CF9BCEDB5C47A8B9851A90FDEF436E7FE6F7F7EF71FA693A24FF6EB84BCF3983D3AACDDD9ED8EB8621384C9D0CB4AF58F56A231CA1B70968958CCA9691AB8FB7944FD7BFF77888D632E7BDFD7177535F9B5CBCD02C95E858D0C6359A2F851125869152DE38B081E02025F74B581B8281436D1D98DC08DF4CF7C8AACD18B4076AAE576216CD47443B812B1013B8581E254CD892B6ECBF3CA14FF992BD8453B31847351E266890539C309CB95859F4C8A434375C8B10B721D6038D525B08AEF592426EBED410BB9F2FBE5D6E22F0687B2CC93C9423FDBAAA019B5437ABDAD2335BC34FCD769C79C479813A6023B2DF5891FDDAF720B684C0D3D97ED65D224A15C83D8E32841 ct = B7146227D186AC3FD4300BEE059E659A205829DDF79558D6BBA2E95F2E354CF19CEDE8D22DD2ABA2F7D5FD0BC6793FD7584CC875C625591589C6482EB4BC87675BEE9EBE074ADB6777D765DEBE2C2D7417204EDFED8E93A0933687A0C91F186D8A85F58113A0887F104838EB763EC9F27E6401118485D2A6D31AF31B68A77A6D61DEA5B6EE88A384E757BC1D7E4EF9A2442975554203BC2FE25A4B319741244BBB494EEEA4E34D57776C11A44957BA6F850C9913B22C0686704A073CC6ED2F6FC0C0CD5B5BD8628A8AEB2C931EC700513A767FC6712096F9112FE7D1B36B2EFC9C5EBDAC4EDFA94DF4BBE03BF59B8DE19EC5BC3D643A7D1092E57F2A03AA4792A16A6C90355BD1139A4C87F760E1604CD347BE894C088D182B42F1A4BDF85DEF3123314146A7C3936C0CDF3889A25621ED5E68BFC286B7AC1CE1070871A272092D500FD9C5B25140D73F08FDC06BEBB2F979C016D63F14E3CB7836923BB3E5B36F71E286D5EEFF138ECFCD1214471772E0A0975F26FDC00605404466D4A153E66D974293E1BB14BCBCE7670F1989C7777E6D8E78397F9943538754B9C9188C747A57E18ACBDD9439E1DC6569E11FBC42E6F1FA0992F783D0075F712BC831BE117B71F1D6D6C3B60FD9337552A5FC818DCE1F6D921E6DEECEE23C05F49A62FAE69C3E7CC91039F8D6D3800D7291725197DD7E389E765B6E439A0CC6D0EDA611F15A093986EF7169530EC67D97C93920C006534014281A8801006FA08DCACF927AC3C512D0B1206B8925BB0020C4E3E4CAE43A696A52C0D0327E2846FA1778587551E58CA1E9DC65B3579DCB43B5C2AF0B3957FD2E ss = 0487EEB2E7C2D8D596BC0727EE2F7DA6C8974017353C72B6 count = 80 seed = 09FC004519BCF85B20D25D314A0DFC79E00CB6262A7DDDF9C52473641AFB8CFA0F5DD5F53558184CAAE9EC34B459E98E pk = 0CE72692B54C6081CBDC85E06F12FCD5B36F43E014F50D1C4408C68534DD6232705AADC7DCD75569593F2E3AF01EF99A3530F6445BBF4DCB4353A29B2C43476F26B6921529C4D3459742DF66F91F44676B1DBD9DF9E544101C05B073DD37351D81B46B02CBD0F0D38422C484A67AAEAF93C9995089FFE2D4F2BE5CCB26F8A1EBF09ED13647B8F6F9E58F5D82055CA4A05BBA5443981E2E47ADA70D35891DC1DB56416C8C989C59645E58952B04938843368DF94E413B171A9B15136E51B6A83E81362634309485264A7C726AF5DAD0BDF98627D1FDDF842E6230623ABF066527A7C44435B117E18CD628DC82709135B5380456FCC2D0A7D0DDB1C93A524A39425668B04E754E8E6CE3DDEE6772ADB78FDB496F2D7AEAF4CC7F6636FCA138A495E60AC375DCE5BAF6F38969118DCF300FD6D497B32A652DC0B8EA24AB3F29D892AADF488A4F47FABCDA67712049AA84BF03F67E89A70A46C8685E82F6F934CE4C3B9BE83B586F2A27E1756116E7B74FF8941F47C7CDC5196F6892D899CF5672AA2B7E720F1974048DE09850CAC540302C04DA9F4B9C6E24036C0FCCC03B1C876406C349B9EA949D151B3E4F61A2709B0D6360CFA11D5F82B6E7F8028DAA40A8D63013E0356CF77CEB7A54AFFAB8DD0B359281A6C71450647298D9AFCAF1F23D2BFE34217CA23C1DAFABE2FAB99B18D7C5CF9B84C8F36E97468CE5510B93F759F6878EF9D5CBA25D4A7970079ADBBE95EFA4629663398A1D4A18B21CB8B64FE11CDBB0B59A255865336C45463BA3B3A6840484D913 sk = C08BA2EF8C3A0A043AFAD931652D7A19E6E8CB670F840DE5F1FA03309B2CA9EC5FE6141A25F7AB9F875F79E0A82D6EA5CDE5A017AB637D5FDB7C42646A1D71DF174E708D6185784938F57441688A68010CE72692B54C6081CBDC85E06F12FCD5B36F43E014F50D1C4408C68534DD6232705AADC7DCD75569593F2E3AF01EF99A3530F6445BBF4DCB4353A29B2C43476F26B6921529C4D3459742DF66F91F44676B1DBD9DF9E544101C05B073DD37351D81B46B02CBD0F0D38422C484A67AAEAF93C9995089FFE2D4F2BE5CCB26F8A1EBF09ED13647B8F6F9E58F5D82055CA4A05BBA5443981E2E47ADA70D35891DC1DB56416C8C989C59645E58952B04938843368DF94E413B171A9B15136E51B6A83E81362634309485264A7C726AF5DAD0BDF98627D1FDDF842E6230623ABF066527A7C44435B117E18CD628DC82709135B5380456FCC2D0A7D0DDB1C93A524A39425668B04E754E8E6CE3DDEE6772ADB78FDB496F2D7AEAF4CC7F6636FCA138A495E60AC375DCE5BAF6F38969118DCF300FD6D497B32A652DC0B8EA24AB3F29D892AADF488A4F47FABCDA67712049AA84BF03F67E89A70A46C8685E82F6F934CE4C3B9BE83B586F2A27E1756116E7B74FF8941F47C7CDC5196F6892D899CF5672AA2B7E720F1974048DE09850CAC540302C04DA9F4B9C6E24036C0FCCC03B1C876406C349B9EA949D151B3E4F61A2709B0D6360CFA11D5F82B6E7F8028DAA40A8D63013E0356CF77CEB7A54AFFAB8DD0B359281A6C71450647298D9AFCAF1F23D2BFE34217CA23C1DAFABE2FAB99B18D7C5CF9B84C8F36E97468CE5510B93F759F6878EF9D5CBA25D4A7970079ADBBE95EFA4629663398A1D4A18B21CB8B64FE11CDBB0B59A255865336C45463BA3B3A6840484D913 ct = B5CD7AC8195C05FA25E1C81350C8F80F17910E08E9080C16044692F21EF9757EA0C807982224E473D4C625511D7BBCBB5024A5B0B8477E4C62740F2B6F55FCEC513493BD310D8ECEB20EE92EEDB05C088F695F03DF50B8FA4898117F6D0EBCEC7F4A7941449782E84FF16AD4829B82DBDCE43E2F8E70499DE72456796DD99FE8480C8273A4849BA4E50C263B98C4E40B0A16C8748F1C9511157B993014C69790E5B49AC1BDD71BEDE2BF61AB031374B4AA9C560E4891C351ADDC914C98FF48FB06FDF1DAD91C99A0DDE83BE0245699DE2A7358F8D2FBB6EA99C2809889048F601BE1742A3C203A2AC237012DA54199DA0F9D5D58B2C7AB18C86F19611DEFBE6FAF8509D2E5114C1C286BB67A3BC07507CF73295A2CFAA25C4E184C7516345205D19A01EDA2044C56813431E0E7B285DEDDF3E8F80E370759E887AF63F2F59349D86CCDD4B3B756C533BBD08859E2F463E3B53B7B937E227F0E182B48445F3EA3B9E221595753E0A29912018F670483DE6788D11BAD41B353F665ECAA108AEE7D483057A175F76AA39FA4AE46F6312A1E6911A2C759B07E1C152FBDA90BE682FE78C67F45F476B7A1E078E2BD855E4425296E0C5D9DD83A42E98B1CC106D400488E62B9269210167702E657BA238006F06B305C9B6B1A7BE5E4C8750568B62E6D22836DC605D8D3E7923DE840EF1CC6EF0C43249282E92F0EC72126EA693DAEDABBFCEA25E02C4331B269D3B939EC18679B98BD1C0652997FF9A2E8E571CFC953771362AB125AE7636AD740307A20AF0103AB1C5AE9FF73E63584603E0272BA3DD47D2ACF3F484CD3F5ED81DFED5B50BB086004F5 ss = 7CFC30F488B1685A412EA126605E6B575E6F2916B63E08BA count = 81 seed = E3C41CCA6F04CFE7732FD54DE30CC5CAAC93E2F80E76AED7D24A962A3969C1B6A311459A3EC3E510E3E9B1E4291D4D7D pk = B66014B654480E7A04977E243244C9F50A75F4DAB121FA4C4F58076CBB87EA65AAB5E9061C07660E09E186338330F700E9C7245862AD0FDD31238B1758B1641CE0ABD7BA99C9B6E43F7C0E361DD28147361AD9855424DE015909AF708406FBD9C8BCFEE44F1CB79E77D4AFCF4236B4A1AC93D157D5D3BD5DF0B7D625C2672C2C48D585E50E1BCDF741050EC6E3133C6D1F2B6C3B8B5CA74F6F78BC1AD091909D60232B3ECE1729020299EF31BE9363F61FFE8E3AB9467D4C31C44D5C8C43A033C49FE2B337C93E54D8A0C5FE7F97EAA8D92F69C4DA6811AA600A27823ADD67193D19E11322A60E090505AC13841FCAF9412240CF3CDB795D27690AA2A07E95071E69DF3EE33BA8320E6171309D3596E2814A9E280181D513B907D98D7CFE52E704069621B0D0A47A7D5BAB1DB21470729EF3F73C57D83EBC3305652672F3A0FBE41252D4E88BED4890696CB5314D2BB6CB725723D20DE2012FDD7C22F9DF5C9A714B13EBD6DC295B39301BB8639B5EC79765C9A7E389A423F6E4F9CFF558A170FECE4117300301ABA2A9336C0AFE823D1AA9C785CE1CCFC27CD9DA00B3D4151FAD8D7A4326FDF3F0E138760819681B4E1E13F89C857D389233FD84CF5BDFE43F2F167FE011C86A52F926EFC3D80AD6E75B312FF58B33B869162899A5E8DD8A8427C7E27BF41754E619347B07C2FB5512A8A7A60D0082CD66CA1A9414B93CAEA192B9672F18B44527597841B3654E6C4EF1289F9338BBDFF5EB63CF9FFE4349C610A4A676FFAFE4E5450492EE9C31802C0D6E0B09 sk = 0E3B30E102D707538C2671060F603BB0B8A014103F132D63B09ECE07E4A4C75B11EAFECA9E810796C34E8CFCE9D59342884456007B01DDD12EDCE6D10ED87E4CE709B0A4180D920F87F7286402996002B66014B654480E7A04977E243244C9F50A75F4DAB121FA4C4F58076CBB87EA65AAB5E9061C07660E09E186338330F700E9C7245862AD0FDD31238B1758B1641CE0ABD7BA99C9B6E43F7C0E361DD28147361AD9855424DE015909AF708406FBD9C8BCFEE44F1CB79E77D4AFCF4236B4A1AC93D157D5D3BD5DF0B7D625C2672C2C48D585E50E1BCDF741050EC6E3133C6D1F2B6C3B8B5CA74F6F78BC1AD091909D60232B3ECE1729020299EF31BE9363F61FFE8E3AB9467D4C31C44D5C8C43A033C49FE2B337C93E54D8A0C5FE7F97EAA8D92F69C4DA6811AA600A27823ADD67193D19E11322A60E090505AC13841FCAF9412240CF3CDB795D27690AA2A07E95071E69DF3EE33BA8320E6171309D3596E2814A9E280181D513B907D98D7CFE52E704069621B0D0A47A7D5BAB1DB21470729EF3F73C57D83EBC3305652672F3A0FBE41252D4E88BED4890696CB5314D2BB6CB725723D20DE2012FDD7C22F9DF5C9A714B13EBD6DC295B39301BB8639B5EC79765C9A7E389A423F6E4F9CFF558A170FECE4117300301ABA2A9336C0AFE823D1AA9C785CE1CCFC27CD9DA00B3D4151FAD8D7A4326FDF3F0E138760819681B4E1E13F89C857D389233FD84CF5BDFE43F2F167FE011C86A52F926EFC3D80AD6E75B312FF58B33B869162899A5E8DD8A8427C7E27BF41754E619347B07C2FB5512A8A7A60D0082CD66CA1A9414B93CAEA192B9672F18B44527597841B3654E6C4EF1289F9338BBDFF5EB63CF9FFE4349C610A4A676FFAFE4E5450492EE9C31802C0D6E0B09 ct = E3B283B96BA70DFEC577032B7BDB964ACE5E98BCF43EA378837B0156F0A1E725161A427CD3B7B0B4370B556E48491F91E0E03E5C59128B10B009874633D4DCA8A4E0C817790434F21ECF97FCB3A04BF5D8FDD8D2EED17DBBF0A69EAB912782731D63EB3C6AAC9B06CE0015856C5995CD66899DA3CD18F7C2FFC04AACE0C1A34B33A91D6FCE94153074D65F49822B7147A67BBEA0167AF6A5889183E0EB7B0DE09338CE0C16620995EB9DFE86C435AA3B5A5C788C29A31944206EAA3A14254723FC79F6080D010084A6F19DB50C78391DD9A6280E38242B3280D8B1C7309A8DD8F10E203A7AD008D50824A8D2C20D66AC12587C135D5DBE4FE1A1A0ABF28755FF64EE996D6AEF66BF6D7EF5FC00FA79AF8D0AA59EA24AEC4BE33553F9BA9E976D2A72B90622C2AA2A4567B6F3D9F2ED707E7A914D1442195030828EBAAC647476919D8BA5BE060CEC0B575ED2A03CD07A3784D15318016D9EDB3B07346710B7100B8BE155DA9B7E6A3659021B4844029536952E6B9E7F4418E0D03920DCEBA35838CA5DBC29E8CF09C1B8AE8C11E46DED66A4E816C94C6462FF2929FC83B35F79257C02566008CE806786B636D6FF64156F949D454FFE41BC00D58E9433F2EE32B19A4569A8F9538FECCDB9DD51A9B28306EC22EB63421B3DA471ED8B626F7EE780E188BCF6E3097F51D08711DC9885F3B9E68AD4FF3330D04E7A297A4BA707D1BBBEFC9E76E868FA1324C1B3BA2496429EBDD01BFFEA48314C168F42909F7B2350D652D5E386864F6377483A472F97A4D613F26917C9AE80282A8F2BADC2E5C9408446D94BABA9E036E3D71BDEAE06C0D44E275A ss = B562AAC505E9695F0F7C1425256839CF515E5264CF68310C count = 82 seed = 373FDDE922CFC416ED96B444E445BDD0962E8989F6C50ADF9912A89937C57217D3600B06C95440448E3F601AE69CA5BE pk = D1057E40C63278B6C18CC6C959BCEB738A0D0BD4FD4327E70D911C8E41A6066D7B8EC0BCBFF8C01584A53D2878B74FB73179BD7283451066EB26BF67E8F24F3C010385B15551ADD727E66E8ED9D6900C6007BEA40EE77107E8D761286B21699C233F644A15439DD97ECBFD293FA0BE9C601F6D235CB9F6E6DC56CA86D9FBD037FAC0218694494189B63C7047190EC656E2275159AFC969D1BA478BBE77DFF449BE8BA80B2B49722A00BE3CBB22ECE7D00313A46393575CFFD21B6D6CE535635E18DA4D1604E7AD3296F5B1873FEB20A9C8A12BABBA7CF88F76E90AB3C08931DD2FCA3B013CE634B96D203D710AD877640F33FE699164AE7CF1957D648DD19931E50993C22202AF13CB33C4CF1B792C8E70E53A661457680D6C3CFCD11416BFF656E793513F864984376B20C0633D057C7D556C735D7152F26EAB3810F8880F808D3AE701E688B3B8EB065DA733433EF5855ED05ACE03B67E9C82B4DECC3DB05F561CE6713604B696CBD5D84F2999891BF3EFD185D515964F6DA5748952EABCF15ED408703308FC25A8854A801B161C383FDA2C841E4CBE9241A9A4DDD9465275F07A71B983BA7350450CB8139A9517A04EA0C49BE99939E00308DC36A05698E19F3B066F99EB790AAE5BA7ABC395576AF2DE1F937D56F2B5FBB331293EFE684EDFC3D0B11C3EC688E4DEF096ACC1BFA3BD576FE20CC6D2C30205734D2AB53C314B2BBED63A3EFC1D043016F4A82F6E23AA44A05BD399A29981DC3CEFA68C4B105A4C07C3A85D4E4AEB1BB2891F13298336C97E42 sk = 2478F7D3DE6041E7E5CD11C5E2EF483D1AA6218EB126444091535F6AE532FA7311136E2681DF2EF881B51A092A9BADBE72C9772C169808521C47149578621E28952F0AEFE4CEA4E32A3BC47C86D24C01D1057E40C63278B6C18CC6C959BCEB738A0D0BD4FD4327E70D911C8E41A6066D7B8EC0BCBFF8C01584A53D2878B74FB73179BD7283451066EB26BF67E8F24F3C010385B15551ADD727E66E8ED9D6900C6007BEA40EE77107E8D761286B21699C233F644A15439DD97ECBFD293FA0BE9C601F6D235CB9F6E6DC56CA86D9FBD037FAC0218694494189B63C7047190EC656E2275159AFC969D1BA478BBE77DFF449BE8BA80B2B49722A00BE3CBB22ECE7D00313A46393575CFFD21B6D6CE535635E18DA4D1604E7AD3296F5B1873FEB20A9C8A12BABBA7CF88F76E90AB3C08931DD2FCA3B013CE634B96D203D710AD877640F33FE699164AE7CF1957D648DD19931E50993C22202AF13CB33C4CF1B792C8E70E53A661457680D6C3CFCD11416BFF656E793513F864984376B20C0633D057C7D556C735D7152F26EAB3810F8880F808D3AE701E688B3B8EB065DA733433EF5855ED05ACE03B67E9C82B4DECC3DB05F561CE6713604B696CBD5D84F2999891BF3EFD185D515964F6DA5748952EABCF15ED408703308FC25A8854A801B161C383FDA2C841E4CBE9241A9A4DDD9465275F07A71B983BA7350450CB8139A9517A04EA0C49BE99939E00308DC36A05698E19F3B066F99EB790AAE5BA7ABC395576AF2DE1F937D56F2B5FBB331293EFE684EDFC3D0B11C3EC688E4DEF096ACC1BFA3BD576FE20CC6D2C30205734D2AB53C314B2BBED63A3EFC1D043016F4A82F6E23AA44A05BD399A29981DC3CEFA68C4B105A4C07C3A85D4E4AEB1BB2891F13298336C97E42 ct = 9B6761E60085053646A3621966892FF8899381CF3C04C5ACA778F9495B1B47E668D38B631D2B0ACBB772C391CC62788CF1323C4F4A1914579D6F2CD0ED4B446A92E20A4F0AFCF59F48ECB0FBDD92B200098786B7B56FABE98EF5D746E12BEEAC662823C92A10ED9FFB44A8780AEA48F5B7416E48514628D4DB9783ABEC4F5AC830AA99E838089CE3135EF73C034599042CD60075E4A2D8B77C574FB4AD0488E0C3980F08C6D5F567D3D75875C7E2374BC10E826C92EFF5259134F367947184B95EBB617B56CC1D212E08EC66A3875C1477D647DD4FD91733673DEAAD791F0272C06B4E5B4D423E5C7EC644D24ABFB2C41F3B05E40C005549556B6DBA573EE153AE2DB2A47FE10EE978349C7D266B738E311CB05DEF015D928126AA61F0FD1BEA08D1D4DFC15DF426C977642E59552CEE3DEC6B3638A857545958151FD0BD1E657455BD5102429EB48E67D9585069A5C9BCA2E39D2124958144B57AE931F0A510AA6D42DE71C2D899110E454F2189A3071B5AF4D2E67A77261D9217641687BCCB4FD7A119E393DFE403E87583BD882C302BE1255F551B3EAFDDFDC301AD053A970CE517031C126351E76D422F221D0C8CA42AABCE5070346F118CB4C938765EA69B10738273236C6782F1899904138D1F73935EE22F162F71D723C0214CFFCF9935FB8B69DBC11B88AC9C4D36A389187C25212B9A3429EF81876CA9B1D7C6D89D66195E6E8F076DA8E244B1BC4CA49A21DA921F5734EDD048D534481C10539A87FD1C2087A400BB7CED7D283605EF8E682B0B7253A5349D72E8D46F11DD76240123634EE172590E3802B9346B2D01947D315C3C12 ss = E8BC2C4C65380F8A98C8534B7F1FC84B9F82EAD41A3DF1C9 count = 83 seed = 16BEF67F7AC3A755C59C816478B75FCC16CE5844DB537791ACCD1EBD49D2824B105FD2E970F728C8F0CF16E439A9AE2F pk = D0C2061595C4702C21B5B4E7C51F1AC6E562FD8C504CFB4E49D6D4FAE76B7004C889E96D6805E5882FF5013F258F374102BC1ED32CA1E0EF4891BBF11A26320E65544AB63CC41A26B44B9332C36312684FE6E05E0ACDA587F085ED63DE40C4EE45EC878878A86877FB37BF97B78337BD8A6FA20AAA500F4B60D554805F8EF1FEFA5E5FEE67BE33306B724A774EBB2537292EE11B490DAD3765C5A63FC4159F97947FC1A9099CF4A21271572A48732078239AB8D5F9F5CA70BD802D3CE3B8224D88C58B788AF19BF80EEE0A2F7DD9414E33C4C720BD29C7A873A6C6194EA365925EA2566C7F273A32C4535FDEE08EEFE35E301F38AD16AE48AFB204B381080EA37D7C9B0667ACDB9B8DB8DB9AC437C08E56D1E66579DF273C2511FBDC329B366AEC80A00C09D71D3FB8F42F32467F6F9E6D6539D4CEC4AA0113FD3CA08901837AF0F93B6354B891EE259C79B082BB5EDE3988CA87F388155C92A0720AB56A5CE69D2150BA163FD0707E3988970B019DC5484C914FC65E525C3280CDE4CF25F8C48EB6354715FBEBEC7292AEF9108D628E5E0D51E6ED411FD4671CE2E2B5D4F46C5D79D264DBC37DD168B91A26212817945632BC469088AF3BA351B21D9044580C70E3E354055128667090E022D3898EEDF17573308C57BEF80B615050B93AC4C0CF5942F4761BA9C362322E4CE9D21EFAFD52B2416F6E16C66FE2CDE7CC4932929F9A261967038E9A7303633EF926ABC3C51835E56E9B9EBC4D666187FA927A34F04D18F0F0740444B3CB2E71F36F3D857600F81E sk = 9D405D3EBDAF35FA8722DE431B669722ACAAEA2FD10B814310B17F78B66147D16CEB14F7662BE0C42779459F69A145C0E2CE9F0BD9A0CD1BF32ED5694CC9AE32F1EEF33ECE28D20086A1FD00DD3EB903D0C2061595C4702C21B5B4E7C51F1AC6E562FD8C504CFB4E49D6D4FAE76B7004C889E96D6805E5882FF5013F258F374102BC1ED32CA1E0EF4891BBF11A26320E65544AB63CC41A26B44B9332C36312684FE6E05E0ACDA587F085ED63DE40C4EE45EC878878A86877FB37BF97B78337BD8A6FA20AAA500F4B60D554805F8EF1FEFA5E5FEE67BE33306B724A774EBB2537292EE11B490DAD3765C5A63FC4159F97947FC1A9099CF4A21271572A48732078239AB8D5F9F5CA70BD802D3CE3B8224D88C58B788AF19BF80EEE0A2F7DD9414E33C4C720BD29C7A873A6C6194EA365925EA2566C7F273A32C4535FDEE08EEFE35E301F38AD16AE48AFB204B381080EA37D7C9B0667ACDB9B8DB8DB9AC437C08E56D1E66579DF273C2511FBDC329B366AEC80A00C09D71D3FB8F42F32467F6F9E6D6539D4CEC4AA0113FD3CA08901837AF0F93B6354B891EE259C79B082BB5EDE3988CA87F388155C92A0720AB56A5CE69D2150BA163FD0707E3988970B019DC5484C914FC65E525C3280CDE4CF25F8C48EB6354715FBEBEC7292AEF9108D628E5E0D51E6ED411FD4671CE2E2B5D4F46C5D79D264DBC37DD168B91A26212817945632BC469088AF3BA351B21D9044580C70E3E354055128667090E022D3898EEDF17573308C57BEF80B615050B93AC4C0CF5942F4761BA9C362322E4CE9D21EFAFD52B2416F6E16C66FE2CDE7CC4932929F9A261967038E9A7303633EF926ABC3C51835E56E9B9EBC4D666187FA927A34F04D18F0F0740444B3CB2E71F36F3D857600F81E ct = 2BD495AD8E524B67F79735E546FF599D9EE9873CFA45D6022F32F626C8948A9489541FC690E27F13214D7BC85C985169EF7946FCD96582F4B5B7D15958448A23520F4A3C8397F6291D5E2C4BABD306D1FCF7A183BA5277EE4B5ACD174E1E73CA97E149BA3CD8B6726495A7BA4529F61D221D730ABDEE22B6639ECE473D4DAA0ACCFEE1E55CEE80AC453C6A4A27B9D8C7A58C1E02A8A3CE7ABD1D01EAF359012BBAA6C2F137A416BD2D9E36031AF68151F13F3D26D876FA7F88B3AD39B184C9C7D5479D78A5568C8AFB322A8EF68B0BD98F337706546967CB83E08785CAA88AC285267C54D63B4BA32CCE21C939B535F6D87ADA3C0529C11CDA7CADA7004168F82B5202EDB457C82A4B254A68723B69289CF14D183A3AFE7B9E01A382270CD6EACF129982022AC02A7847CC420EE0C8A8C89886C3BAB516D04C355E76791AA9C1E03E719931F73D40CFCDBD46AAED0BECF28A61BBB27431E031E40E2CC6131ECA2573C850F3C3A9ACC90361A530F2949121842A34267151300C54639D59B394A528189B8EA8D84024AD73B39643B5AEED24C456A7AB802F7EEA3B9493343E3E773AE532C52A91128CD537CCB2425619857FA2AD95485F079B8AE6A7A0C7312B727AD31CD03A627F996294AC1DB2AE7CE1DBBC681D7326C3FC77E0222931AB24AFA8721D5373A38D8D845A08B763B4FC2DB63510D58E5EC5D80B1D76A461395731888F61FBD91E1B83C1640AF97B8D4FE815871C30542F617951ACA0D85759EA3F00095F08422497D5A58AA1A22CD20A8DD14D7C01A7AA3AA64C66FD77252E808D2C9E0701BD61862143B5CC524AB1A32B5CA6AFD5 ss = DE342D6B8DC3354B83B0E64D5FC0990E4F50CB34B4E6507A count = 84 seed = D0611F9AE5BE4DA5D7EADC9109944348E716CB3DAEE545721EEA8C892E7831CF2E54603146454CBFD92387739E9A78D8 pk = D4D369C42FF45DBBCAADAF666EE31F6D074DFCF7C313FA54EACAF6951AD7985AF71A06650FF3A1AF99EDA097AB9DB299CB9C332B9FC799FE7321E5E260310F43BF2093060BFB7FD7EB8CEE26E84AAABE29E31DBA26FD135B560A576B976B9DA82C873B92DAF79C46208BAA8AAA1409F508B6A05255E1B19506254AAC85120629B7DB32ADA9D182269348E5102F3A6A45AAB94449EDBA11E60B1E848036F4DFBD38869D86AFC9CC66208D356F38A7EDB095B7F5FFDD2BEAA82EBBE04582FD60D298C766F5698ACA98443C27E37018211A9B3A71A356421C98475B8965D94DB04C8B7A56048FE03414FCC05D5FDA9601358294878C2D5FA728307BA8AE9668B356A6F3603CF4C23C8993911F156A8123B31D24F5E4FCEE5DF92D42EFED654130DA5907B223F2501830447A814FC347601381EE2B6D3781DE9AA8222237EFEC00E188869FE9E10A8C1E00CBD454115ACEFEF3BFA46147B36FCE6B0F135279E58B2266E027C452FE3A2E16098445E590AE22FDEB769773F7CF5C9B33DCDAC0F905C41880A83451ACDBED5F3A05A3A8FF125DD9BD84A8B1A630743D8B85BD0D04259ACF9D152067DAB8520627BDD5D926D85B0DFAE760F86C509DF5C17453A0AE9A76B003CBAAEB71F2AB385EAC23C0C3CF61EEE4EA4B2E0654B1B2C4D4E47CDC38844100A5EA28063605FC1312911895A5DD581B4566AE7F921F79B33723E9039CA6605F3D422706046B7A7FB957DAC52FE11A3223A1423F81383EEE92641B9D998293D11D32F657F65F838675CB71A7D882EF81F168 sk = 9A86490F0615F3EDF789CB0654066E9EE339CC59F968281F3B89213F83C692EDFAEB2EF44D2F608621E831187CE79B2D2F4A20F1568BBE76B0D3D5AF361117140D780101E59B3D63CCCCA74C0793CB03D4D369C42FF45DBBCAADAF666EE31F6D074DFCF7C313FA54EACAF6951AD7985AF71A06650FF3A1AF99EDA097AB9DB299CB9C332B9FC799FE7321E5E260310F43BF2093060BFB7FD7EB8CEE26E84AAABE29E31DBA26FD135B560A576B976B9DA82C873B92DAF79C46208BAA8AAA1409F508B6A05255E1B19506254AAC85120629B7DB32ADA9D182269348E5102F3A6A45AAB94449EDBA11E60B1E848036F4DFBD38869D86AFC9CC66208D356F38A7EDB095B7F5FFDD2BEAA82EBBE04582FD60D298C766F5698ACA98443C27E37018211A9B3A71A356421C98475B8965D94DB04C8B7A56048FE03414FCC05D5FDA9601358294878C2D5FA728307BA8AE9668B356A6F3603CF4C23C8993911F156A8123B31D24F5E4FCEE5DF92D42EFED654130DA5907B223F2501830447A814FC347601381EE2B6D3781DE9AA8222237EFEC00E188869FE9E10A8C1E00CBD454115ACEFEF3BFA46147B36FCE6B0F135279E58B2266E027C452FE3A2E16098445E590AE22FDEB769773F7CF5C9B33DCDAC0F905C41880A83451ACDBED5F3A05A3A8FF125DD9BD84A8B1A630743D8B85BD0D04259ACF9D152067DAB8520627BDD5D926D85B0DFAE760F86C509DF5C17453A0AE9A76B003CBAAEB71F2AB385EAC23C0C3CF61EEE4EA4B2E0654B1B2C4D4E47CDC38844100A5EA28063605FC1312911895A5DD581B4566AE7F921F79B33723E9039CA6605F3D422706046B7A7FB957DAC52FE11A3223A1423F81383EEE92641B9D998293D11D32F657F65F838675CB71A7D882EF81F168 ct = B1C3243A6C12E5AAEFEEC4AD2E9BFABB476FA5D3DDBD297AD5F17F9D5CC3F6DA7F43726FDBB9A6BEC260038BAE5F0BAB89D34E8E40BB061A1B521D24A6E94AE6BF5FDFB19781B6080F9B5D9BFFACF215D7598E8FB9B9C61BAD43DCF69A397938956487F7AA0A4958AFDC64B378F1C1EAA80D34CFE3B7D2AB84618EDDE05E814AB27BD26A0865C739D772DA67AD47A424C69F16321327B99EF1FF254953EB84CFD81A02C889040C258E6CAA2FCD3EA8B22BB52DDEC97F83BBC5B6244D5469DF902E7E9B17510E9CF1BA78BB37F003CA8C894D2C22EC970EBF07AF7A87DBA4EA218BC1263DB256AC0E30C7CFC7B4E0F533206FCDC87AAC69CC6FE5D85064B21F2887AB778EAD49362B1C0AFA34286D6959CFAD036C2F6D3278655FA6A738C8C1E448B239C203ACE800F20088D7166FA355D8EF2E1BAC3677676ED85956ED33222305EC8E8E01BFC179AD95D212FFE6F0BC45CADE3E8747DC5A85EE834F984386B9CA5225F2A4D61B3FA7F9EEE63283FF5A1A71A888B4044050A4FDF760AAE4EEF42D4DE846348D7E692D04747578B40CF4F0A40414C919E802DE62E8CC5DC15B9744F91C2C5440336AE73296038304B40793617B4A6795BAA2466419D796EC7A312F1A5175450A3334F07EBCACC381AFB32E837EB2101871256EECB9513ADEC14180997856BF16A3004788DFB4911D97C256B5973B0D0D4EAB6662F3329B44CFE2D15F2AF1A3855038CFE995B28957ACC2F27433578D9766A676E4BD3D004313074B1F8228EFF4E87DF95522B28D90F3B54DAB7A2D4F5807F615EC4FC0833B1C9A79B3539616DEF99ECAAAB0E73E9F071D248ABF4A ss = 35AE89D157BD8CF5E1F8B18DAE5E7955B84D6AC23A816973 count = 85 seed = FBC38D7614D7718E931EDB850D2C6F0C5EEA9EE889B3E25BD69AC255D5B91E885D93E808E66BF9C88C655DC594DA5792 pk = 6F9C41FCB3A0E1AEBA96EE2811A88BF1804D3354E2FABB1D94174C888D6AD7E26803C9B0F94FA0EF48EAC529FA7E9159EDC74DCFB82DE896BF08A41153D1CFF064FB73168D8A59042FA4559C78B5770784C88E5EA18265F43BF8939BB450FCCB98849CE6314FF88723D7EB6C8EE26EC829FA236E4CFFFB9ADD671647C8F431FCF4B39C49E4D6CF86B238F53BAC1039A86537DE5ADCFF22D59B54DEC77898B19DAE21DA7B154DFE75D1FF789F550066036498992E9F07D8FA59FE093E50696CA2BA3E8C97B19ED82283868646A83E8DC81DA9B6F2EED9D794C58805D1BA2302DA8FAF69459FD325AAD6861C3C76D975936459C3E963B2FE4D644B5B7A492ADE60AE2D57E9FADB4E5CEF3BE801D1419BB6FD5158C36F39D78AFB2E6EDCCC410B37A3EB5D691DB732484965F59BAF48B94001E61B9FFFFB80DA804C2DF3CEFA9D78EFD26E5CF177CCDF45407FE17F850879F89377C125990B58736F4601E0E8E7617C3A38853BF1F7945D6E641A44B5364F1B57D46C4E9BAA496E3C03012013674B7A123F94EEC7C136375DE614EA98F1B4F43541E95BAFA9A34C5FB6808A4857605EE1FBB452FBF065BD882BE64EEF6F206F61D8214C7B9718EB92456EF3FE2645E815DB91E71C22D975440CE0A0BC402AC30E487B2243044734A9635D4BE0CF689CC817BAC3C62BE50E86FA20E9434700571888A2CD10B6D010BE4567736D02523D9BD8BFC5F1220F22E68301D95AACCF3D92C1158760993224ACE54604DCF0B799282BE4D8F5F3556610D1ADABBA90AE6C7B8261 sk = 6DFD9B575872560C7BDC2732C4A28DAC4DB04E535EB8E402C3DFFD145C09CE47A2985C1C4D203778597947D710DEC806E36B0CD949FE460EF141213BFC525E5BEE66291AE5E226AE015D9579E3DFC8006F9C41FCB3A0E1AEBA96EE2811A88BF1804D3354E2FABB1D94174C888D6AD7E26803C9B0F94FA0EF48EAC529FA7E9159EDC74DCFB82DE896BF08A41153D1CFF064FB73168D8A59042FA4559C78B5770784C88E5EA18265F43BF8939BB450FCCB98849CE6314FF88723D7EB6C8EE26EC829FA236E4CFFFB9ADD671647C8F431FCF4B39C49E4D6CF86B238F53BAC1039A86537DE5ADCFF22D59B54DEC77898B19DAE21DA7B154DFE75D1FF789F550066036498992E9F07D8FA59FE093E50696CA2BA3E8C97B19ED82283868646A83E8DC81DA9B6F2EED9D794C58805D1BA2302DA8FAF69459FD325AAD6861C3C76D975936459C3E963B2FE4D644B5B7A492ADE60AE2D57E9FADB4E5CEF3BE801D1419BB6FD5158C36F39D78AFB2E6EDCCC410B37A3EB5D691DB732484965F59BAF48B94001E61B9FFFFB80DA804C2DF3CEFA9D78EFD26E5CF177CCDF45407FE17F850879F89377C125990B58736F4601E0E8E7617C3A38853BF1F7945D6E641A44B5364F1B57D46C4E9BAA496E3C03012013674B7A123F94EEC7C136375DE614EA98F1B4F43541E95BAFA9A34C5FB6808A4857605EE1FBB452FBF065BD882BE64EEF6F206F61D8214C7B9718EB92456EF3FE2645E815DB91E71C22D975440CE0A0BC402AC30E487B2243044734A9635D4BE0CF689CC817BAC3C62BE50E86FA20E9434700571888A2CD10B6D010BE4567736D02523D9BD8BFC5F1220F22E68301D95AACCF3D92C1158760993224ACE54604DCF0B799282BE4D8F5F3556610D1ADABBA90AE6C7B8261 ct = CC87A1063E781199C02F0F5066E28C99CD5E97303BE6A06123241EC68F75B32FA75545528AB6141AB0C3FF78E354C31F3B9B603BC877B929CAE50A54993AB9DCE5D3E1BF164C899F1D9AE57287113C5D68A8904B1D08A457A3A323BAC4495AFDE5EE0B5C1F6FE75CA8DC5A75A7200CE088186D4588D4BEF23DD74F3C375A54AD8B9CF8198A645196DD747BB3EDE4C99A880D6D23619927F15D1EF9485AC5FE03B6838C80F3C2BB09E4DA6274B411CA16961AB3984521581D22130019FD39A403F3C3F63F53D316409F57372A1BE4B935F44AA0E11235AF46FF9CB9E62144360988D4D2245A34E3B77F112A377A56D3D73E93AC5CFC5E3F35E3B3ADAD002C5A564DA9F7C0EF9EF831F61F5389DE3E3D0BE18853C67696F94EBD6DCA547FA9EB37AFA847BDC172010EF589EFEF2EC24E9C5AB9DDFFFDD5C85A75105FC3C50E07DC8199471FC87EE2EF29C2DF85516641976C5050FC665DEA13980B7961661243DBD3B400890372AD120528EE65024A6D78592CF5513E223B6CC635632B3DAE66AEF6DCD6F9496B08B85318AF6E3B8D228DC3CA5AEC7F91106FB60F61D75FBA5BEC0A0B9433091E62481C676F6CB743CDFB1532AB8AC34D4B4579A360A685A21E32598F51EE4556870A8D1DD3D6C067C497B48EB2982D16D377F08A1C46E51F836C4087A65655CCF6ED4109D0AD8E602784813CFFC5E1239102B26E277CFCC554104D5FBF7C57A610FF56C5BA28CA106962BF2B735DA1812C96DE6F6D7F15F79AAC137A28408139FAB1A2B2E1E0EE45F662F61D405AFCB71F61F06906334F24E5B1266FA708AFA0926A31B7970D98716CDE9B20269B ss = B1B8B7E39D35E84CFF6E4FB36FFB3BB2C1DAECE957A2F318 count = 86 seed = 1722219CB5DB47374EB0AF0232C856A57F026F1CB09E5A5799F4C333DD422FF6A0A67C4DA502FAAE727FB2D45DAFCF35 pk = 0781CE3142048FC65FB3CF9A0225D26BA57DA3F6D2E55BA36A8B65D81C9AFA2E00EA3AB0D002164DE8DA7AF786F60BA8D761C62D3DF4BA54E7F50D16974D35C5C3F1B22D45449D64A2CA9CB9FC075B8DA2C22880DCBFCF3AEF6091274E626DDE3A4A559A695B0BFA541D2BF9823523FA27582AED3CC6E7E4C5361F14AAF33E35E8E9C85938D198615560D740C975D3A950565116FB502327EF09C769ABCCCBD70CED804791D9E62F4FA6EE1B4A6E5D432BAD93496BB0E6227101516DDB317343116E374EA766DF124B2EF5CCE6A8321A14B932E6DA33C22FC7BFB8B38F5619ED7A54D014B29F6C743CBABE2C715FCB642F71B0D6532EF10CE36CB43D43156625169073C78247739D4154B366E142565610998B7EE0CAEADB9F28249C7B279A569D845316EF91AA794A47931308DC876EA10B5F29CE6ACEA8ED637A4463602C48D13D40B5D8FED501C2BF338CCD4C13AC750993C5D15D408CA9FC0E63AFF4633401EC7BB9C8DE46F10754F142E9AB8B38D1FE588A1F9B315C7149459402E9E10BAD5A1B379195FECF32CF72EAAA5DB93AA81ABDD896355B221622761A027881599F7A67A48CA26C1597691877732C0A281B58DE124E0C52006DDFDE3A090BC3686156521B408DDD7EA7E5352F47A91956537FE1642D0F61B3CCE58538F8AE2C6774F92BC99BE87715B5FEA09FD450F381868E48B4D880F83C1FCE999DC5772692484E26EC0D03545661242599C4F535811D0EDDB6D318F50CAA1FEA925CAC35B8DBAA7B57824EC9A6AF71BA9860D08736B9565D3C sk = 6FCA9F4E384D8418075CC064C70730801BDB8249899D456A77130D5BEEB3662CCE7683F8A03D3CF04E46970FF7D6A12494AE12558346DFC8FD9370BF944A01022AD673C62EDD8B7D17F5459C9D1DBD010781CE3142048FC65FB3CF9A0225D26BA57DA3F6D2E55BA36A8B65D81C9AFA2E00EA3AB0D002164DE8DA7AF786F60BA8D761C62D3DF4BA54E7F50D16974D35C5C3F1B22D45449D64A2CA9CB9FC075B8DA2C22880DCBFCF3AEF6091274E626DDE3A4A559A695B0BFA541D2BF9823523FA27582AED3CC6E7E4C5361F14AAF33E35E8E9C85938D198615560D740C975D3A950565116FB502327EF09C769ABCCCBD70CED804791D9E62F4FA6EE1B4A6E5D432BAD93496BB0E6227101516DDB317343116E374EA766DF124B2EF5CCE6A8321A14B932E6DA33C22FC7BFB8B38F5619ED7A54D014B29F6C743CBABE2C715FCB642F71B0D6532EF10CE36CB43D43156625169073C78247739D4154B366E142565610998B7EE0CAEADB9F28249C7B279A569D845316EF91AA794A47931308DC876EA10B5F29CE6ACEA8ED637A4463602C48D13D40B5D8FED501C2BF338CCD4C13AC750993C5D15D408CA9FC0E63AFF4633401EC7BB9C8DE46F10754F142E9AB8B38D1FE588A1F9B315C7149459402E9E10BAD5A1B379195FECF32CF72EAAA5DB93AA81ABDD896355B221622761A027881599F7A67A48CA26C1597691877732C0A281B58DE124E0C52006DDFDE3A090BC3686156521B408DDD7EA7E5352F47A91956537FE1642D0F61B3CCE58538F8AE2C6774F92BC99BE87715B5FEA09FD450F381868E48B4D880F83C1FCE999DC5772692484E26EC0D03545661242599C4F535811D0EDDB6D318F50CAA1FEA925CAC35B8DBAA7B57824EC9A6AF71BA9860D08736B9565D3C ct = B1FC2FA4BF12E86594E4933073994B503BF47E8B5E60D103344EFDDD6F8BF3F8E5870A594AE05ADABF7BE979A0983D0EA38F28524372D29DFC6B63B91DAC9BDAF095742F9CF19E6DBC1F502310A5C8F8E588AABC6F16AA020C35D63F096ADE93D9D73AA43A1058BAD65CF271DCB61AC922163EEC02AB4BADC8807744C7EE8E3F9B0F536F2746EE4CB425C58E9DA33B5E991A7108351B15D0B5B6942B0D316075D6DCFAA9DDB2D47E4F7B1AF74D69B3DFB1F069E653651C7847DA545BCB2AC1BC8337F2033031707E65492D4EE80CC481EA3F071272DDAFD48A8A7357F1D3EB1C00D49E46311F5DA74D645086CC52D4B5CC3042C85457CD3769D9348C84442A73C85CF00A86863361C07F430F4ED322F0FAE1EE7BE8A6F900D225C8B93FE4A90FCEFCEBC214B1D3F79FCA233E26C1C1372A5E0476A51CA4461870899F5F12554D5BB2FF8334F6E19017EF8605C06C0E99C07482D4C9ADC5BF4F6A2049291A59163A47D0E515F68C17DB9E7129EC57B0F32E626C3E7851A3658A55EB1C1F00968B2E5AAB879C142404B652EB5527073A502ADFF9EB0CF5C9EE750F01A27E57949E06241D5499556BFD6BDC7BC255466890FD525BCE3401144394197037392BD40071F40B1E45384C7C6E4DF9877130E5AB061C43FA985D5191E5212993337A06643B9B3FF7672DF4C918D9AC0FFE85DC6DFD2D339FB21BA3ACA3098F48723205589C82FF9BA2C0F22DB1C2EE12E0E400AC6678434D5F30737E78A677C27B9C1CF2E115FE337435FFC9A003216FB9F8E24FB87D830F4309BEB167DCF4C1F7CF29EF4F29C4E6449BF2333FF0CBF0489001382C79B3C0 ss = 1333FD5A66921A197A9E3DE273120E79FEE156EE54E6C7F8 count = 87 seed = AC139B78FD16CA0F26D6D7F9E15345C888D857B1910CF38D883339B37EAD2DCAC30F7CF10176F23FF34B4488EB79437C pk = 22A2F0DA9357F94373397F34E0FC45A5FEF2D2BFE8943DDD0ADE68773BDBF36A6FF29004802AD6C2C4DFBB9FC62B1FBA69565BA8864A2169CB14635E86AEC5DD3165C54CFC3480FEC30D19D5C893F1EB3BA5D6B8D3481DF17E6CA8EF1B136627E467B6B7B27CBE40C5DB13B8A9225BEC96A55D30E1A63FAC454D1282E4FBF8BCD40F8D8E535C5D0B0D266010DC2F6E8AB897C628BBCE1264CE2364CB563EBFB88696F9DC1F8A7030EA1E4E86A1DF4BE1566AAC4CAF5F714CD47C35583F27CBF12614D9B31DA40DA9B59237F4E26359246CEAADAA5C620A8BA29B52B6BF97B71393949510C701E773CB982F14B59D0039B9C5C013E5EBD01D4D262A0D6B92B994F7D6B048900A2E710338820F2B2FBE0FD6D8A4BE3F73C0731D11FD97A3CED7EA71D3B20384CEE06A648A876470EFDD8F6AAEFCA6AA2135104AA9484FD78A0037D9AB53BFAF34C62F1CD4ACD223474104DC6AB2FB310143CB56166E56AB328F9E87E796701048B58C828B878C53C16622D5D395FC3B1DA33C7FBDE40FD2105234FF9225ABC8BFED2F6F99A9BECE83690A886FAA0B4270AD4C29C0E39A889A60CD57D0A85573AEF0E09F84F093F512B7A19AF938D99F0D5C4A79DFB57D770CB186B2BD3382C2F649D25AB14B6AE83D589708FACF66B8454C8525C4BB4CA29FE4483EA92B68B974A354572CA71A203853B98DEF1C5287EDB8CE9B4796B59C2A68AD61E76236E41128DC874D0E54B0A6DEAC1B99813E618ED7C43618831D19316256589C58875C1F4E601A24B476565524080BE22F0C sk = E58F71BF175C0550A67E00E0F7B3B7FC36BC2707BF0C93044A492626DE36301A7F7054814869CF7625E45647BC1547AFF288DBB90699B2AD84893F3B755D9722814394AA8D7C351EC828975853DB530022A2F0DA9357F94373397F34E0FC45A5FEF2D2BFE8943DDD0ADE68773BDBF36A6FF29004802AD6C2C4DFBB9FC62B1FBA69565BA8864A2169CB14635E86AEC5DD3165C54CFC3480FEC30D19D5C893F1EB3BA5D6B8D3481DF17E6CA8EF1B136627E467B6B7B27CBE40C5DB13B8A9225BEC96A55D30E1A63FAC454D1282E4FBF8BCD40F8D8E535C5D0B0D266010DC2F6E8AB897C628BBCE1264CE2364CB563EBFB88696F9DC1F8A7030EA1E4E86A1DF4BE1566AAC4CAF5F714CD47C35583F27CBF12614D9B31DA40DA9B59237F4E26359246CEAADAA5C620A8BA29B52B6BF97B71393949510C701E773CB982F14B59D0039B9C5C013E5EBD01D4D262A0D6B92B994F7D6B048900A2E710338820F2B2FBE0FD6D8A4BE3F73C0731D11FD97A3CED7EA71D3B20384CEE06A648A876470EFDD8F6AAEFCA6AA2135104AA9484FD78A0037D9AB53BFAF34C62F1CD4ACD223474104DC6AB2FB310143CB56166E56AB328F9E87E796701048B58C828B878C53C16622D5D395FC3B1DA33C7FBDE40FD2105234FF9225ABC8BFED2F6F99A9BECE83690A886FAA0B4270AD4C29C0E39A889A60CD57D0A85573AEF0E09F84F093F512B7A19AF938D99F0D5C4A79DFB57D770CB186B2BD3382C2F649D25AB14B6AE83D589708FACF66B8454C8525C4BB4CA29FE4483EA92B68B974A354572CA71A203853B98DEF1C5287EDB8CE9B4796B59C2A68AD61E76236E41128DC874D0E54B0A6DEAC1B99813E618ED7C43618831D19316256589C58875C1F4E601A24B476565524080BE22F0C ct = 5ED812655258BADDC6A015D9D197D82AC5CB751AA95395A0F10B706F47A2E10E6A60DDE1797510199D327BFAC349219580149670EA078D03E7627FD762123DFA82AB70A043737B4906075925121EB61F97ED19025BA2E3E6BA9AA2A8AF09B32E884476FD1BCB47580A5334AF27DCB8558B11F8AE632033D173BC50CAF32ACF869133B93094E9103722ED043B0C6262FED1D5D30D9A9D5084293E0605E2D4252569530FAD2EF297F21A04FB530C41A0DA340BC8219B2FA545D48701121F0D06CB6B8448C55AB641C7FA6CFFE10635AFE6DAB818F31D6AEB67C5E4400D6F8C8552426DE4F626976CD4D727C4F4345C797DFD1D329BB51B0EC5BA4B0CCA2A364EB10885B7734FD197F07B23C95E3841BEE14FB9AB658EFACC88D521004C5522EEBBB0151EF3A00D05561A9FCF880F81D37A2FEBD5E045499D4496D18B2F86703188E584505F1DF2026D2CAA34F8F759EFF1ABD4D27E2075DFEC9DC3FC3F9A3E7EDC9151200DD381EDCE8044ABAA04870A46CC231F6A32D48E5A8C4D355AB3DC1D1897A97584356A60BC9418C549B0D0FB82244A5AE4A1CE7405E7626DCF03684895F0A8D5D4FD0D0A2343DFBAA21606CDEEEA1B11EA1BBC4C82098EFCDF1824095708A96BF65A49D18D9DB22FCA0B6F56BDEBF3101D9634EE5AED5B1CD134CA6CA0EE743A314B45A22FA183363F07E29FF51832B48ADD6A45985D5041EC5F4BEBD1A4BF23ECAC27BE1A9BD724F722185C2B40A3ADE250B78EFF76677F5AF00FD2D1F3A30C64CB49EAC4CE56862716C174B39AAEAD515457CF8C8A377C8F9E1608E21F5EB3DECDA8D767727BA2DC1BBEAD16403135A7 ss = 75931798926D93A6078121455176C548342F0FDA9BB20063 count = 88 seed = CC7152849C98D5FED2813275D32069E44824ECB14EAEF425CE017448CD9A401C91C06D0F7EED6D22B7BBE8BA6C429EC3 pk = 849E7803495C220128C742E284AD8FE7350B2F44D563D87017ECB43C0D568ADEB0BE5A09F6A84A194AF50F17EF0BC9084357A7A215E601AFB10E148900020D26E66BB35C201A042C2143449047D88489BF4B65F1370BFE5860446F93B364B89CFB13BECCE912813A1F81677B09AA6E4A4152F2639CD9F0D242D29D0F1B0E9CF9E12F869AFBD3C63FB15A778C8E845045A148A8D3DCC26FA07C15CCBCB1A71530DDB7EF11F7CE64B12C3CE570B0A2A906F6310AEA05C3CC602354611E9697046895B961877F20D3D208E2C1ABC272C255D158988DC3B1FEF6E6176CE685E2175A160CB1285E97A6C28FFF0874B47D62A35FC5C0851A1C2E3159AA06D2F4A8B9504D2CA86056A63B3659D383FEE9CAF46D12E769500913A2CA01480D64C3FBA3BF5F428E0FE38CA8E6876683D40748794BAD018FB5831E3212FE597D5115A649E7D75051AAB6AE5782D8EBCFA73CE9EB5BD68AD1647E5500C150D4D4FDAFFAE069010C16ED9C571F583F1E85ADEE0966EF24323A8E7708DD153AEF2D739AB69F8AE58177CBD5E5258E909B612A6B90B81C6C21257B49358348400A19AC027F7B0A0582665A16AA3251A663562EAE25EC950A8E330D5982509EFCCD2BE63C6227B10468980FEE0D0F5E770CB57E797C88FE619D96B0BE3C55064965A47479FD7BF795A30079AAD24650361B4FF58E2B86985A4BFB647CDD7578E32558AC9C2B0D87063169E1C92115E33BEEB31691EC07FD15AA629CBD3FB378141BA2A53030F27A5C518B25D9057FB5CFB02B06978A6A6B891C241D sk = E3FC575ED51513E62ABA655D24CD9C8F1C6C848AAFFA946C49A53AC3EA59E474D82C2F1BF2E6AEBDE5660FA73356982E12999D8FDAFBB3CB186341D0386DEAD06ABF589AA1E7C22EB20E04C5ADC4D603849E7803495C220128C742E284AD8FE7350B2F44D563D87017ECB43C0D568ADEB0BE5A09F6A84A194AF50F17EF0BC9084357A7A215E601AFB10E148900020D26E66BB35C201A042C2143449047D88489BF4B65F1370BFE5860446F93B364B89CFB13BECCE912813A1F81677B09AA6E4A4152F2639CD9F0D242D29D0F1B0E9CF9E12F869AFBD3C63FB15A778C8E845045A148A8D3DCC26FA07C15CCBCB1A71530DDB7EF11F7CE64B12C3CE570B0A2A906F6310AEA05C3CC602354611E9697046895B961877F20D3D208E2C1ABC272C255D158988DC3B1FEF6E6176CE685E2175A160CB1285E97A6C28FFF0874B47D62A35FC5C0851A1C2E3159AA06D2F4A8B9504D2CA86056A63B3659D383FEE9CAF46D12E769500913A2CA01480D64C3FBA3BF5F428E0FE38CA8E6876683D40748794BAD018FB5831E3212FE597D5115A649E7D75051AAB6AE5782D8EBCFA73CE9EB5BD68AD1647E5500C150D4D4FDAFFAE069010C16ED9C571F583F1E85ADEE0966EF24323A8E7708DD153AEF2D739AB69F8AE58177CBD5E5258E909B612A6B90B81C6C21257B49358348400A19AC027F7B0A0582665A16AA3251A663562EAE25EC950A8E330D5982509EFCCD2BE63C6227B10468980FEE0D0F5E770CB57E797C88FE619D96B0BE3C55064965A47479FD7BF795A30079AAD24650361B4FF58E2B86985A4BFB647CDD7578E32558AC9C2B0D87063169E1C92115E33BEEB31691EC07FD15AA629CBD3FB378141BA2A53030F27A5C518B25D9057FB5CFB02B06978A6A6B891C241D ct = FDB20E1A9AEC58E4EAE26692092112CF9CDEF24B434B3E64208C2603F9ACFB935060C7E2EDBD806E9182001B7DDC9E252342471F2050B6120A07A77F98762A1FDEDE6F91DA02262E020CDBC62EDDAEDBA15CA426AAAC90FD08350EE88B1033C3C36516516E5D636BD9481D7356AFAD1D82AE9594AEA65EB37853416812DC294F461DCC25235A1407F0E1728955EBCEC2B4D07BE5AE9554FB76EBBEB4403E5A8CB2031F0B21DF2566E55539017955D3B640F6A86EFC0518AC7A72DF41A2DD573DEE5AFDAA102F00E6174712565B80A79222D5AFBCC16FFCBD943735BBFBF5BC1E74EA93B02433BEC1F710E639E89C6A3B0502ACA305ECD57A4F04E960F40724174D7270EF09D15B822A8807A6324484F2283EF8EE61BAB2F4AD0593C35E14D0A99B11D47D16DD5E4772B97204EF2204ECF570F3750B3985CE04D9B5C0958D8A53AFBE85100223756BF89CEFF9F7F9974AF6BCF07E9F5070830F9941C71F68A2579BAE6B486627119F41B82BD91E7F44AC4E274277ECDE4C06E08B4B928C6863A981456921CD2607BCADC36CC788F2DCA3E158B772818306C3BD7D076C092984834C72C12CFA840ECBD072B25C642ADE11FB5FCE8B15F8E9B85D4EECC8B0C4F47D259E3CCD298AF68A8BDB11E8116CC29ECA16D05E0B54D0B4338D4B2F060B1AF2DF21A2C0307748D9AFBF054B560110B4BB664D984224E9EA2E55FC8D7DB77FC748F998E9FF217751FDF8FF0FA7E2BF9D9E56A5141B844FD10ADA0A6CD16ACD279E702F572D79426790F163D0B706C9A53C3437286F05ECB050D652FB56034AE22786E8E8838636623E67AE41DB89369BFF6EDF5A ss = 2BAF6500D216CCEADBC28842E94D2E8F1B057DAF6F452FD1 count = 89 seed = 96D9A06F88FF2C2036FA8E914B89C765E4A510B468DEE40F914F78858C811857EFE9FD0E17C0048E7389E8D996B7E2B0 pk = A4021A0B5D93862278437D912EAE64C7C293CDEC20474F8ED8A2E89DC2122D0CB8BC6FD8F6FFFF77184EA343C283B9746A1C57333DB2AF7F148C45210A1DCE3ED982395CA4BF0957478C238A75FB8651933C1A0238C0B2AD6BD9B38FBB4EA9DCA993A6DB89682251CA99956898DBF2F8FC4B2EDFB896D15B134AE5C89A93C4FB5353348B3A4BAB04939C93FAEFC568BB868C810C79CD4E0312F793C43E336087B5A6FA97A90E23AC759DE28C5BA40BD753A37377DAC4D95835F7FC066352983A2661F7976F99AE9D148E5CC50130FC834AE7989ED9098C61EE67096F6A5E6A8F7663223A9C0950E4552A71B7D18A3ACDF7B34009F3DA5382D20A4B0B768D61CC37E55DC1401E1DF5CA502E3307C0A3F7F24E95270280283F0B1F5760942D135F1CDD1F08C25E43A2159F9BD7D0B46718F1FB9DB258E82BA4416247BF60BEF0522F5F43B1A811AE60C96F716EE9C2E3855698EA400433889BB3B94656C08E0B0F20F6403F8D5014D2CC2FF0E75E5F6CD8AE1567CCD3510A208570781F00280EB10BFCC57CDB5531B0F17FE67CB3B0A315C0B0C44EAC59F7326A3DFD351AF5DADD76625E8BF36C5633EC792572021E7AADDA8FDFD9398ACC6EF1EFEE2FC149A4D43969D7DE655C681D1C8301338F53A7F3EE78A051EF487788DB49710B5EEDFBCC2D05E31334EB144A36A2CF434B39E02516516A02BE09610F37BEF8A2668A2F2D9AD3F5572B35464AF201829B02BB42211EB5D469AFCC4EFF6A8D27DAA44FF1906777B4A1FAE1483722793AE12249833DF69B0A44 sk = 470B4943F0FE7FD0D8EC5185ABA0D1DB09D112934E4FB4787E2BBC6B88466E7B8B2809FD40008BE70A6B184981101724BC3D5EC5E1956B510B82FD5AD0668A5A4C4CF8794833434B07153F4FCE619D01A4021A0B5D93862278437D912EAE64C7C293CDEC20474F8ED8A2E89DC2122D0CB8BC6FD8F6FFFF77184EA343C283B9746A1C57333DB2AF7F148C45210A1DCE3ED982395CA4BF0957478C238A75FB8651933C1A0238C0B2AD6BD9B38FBB4EA9DCA993A6DB89682251CA99956898DBF2F8FC4B2EDFB896D15B134AE5C89A93C4FB5353348B3A4BAB04939C93FAEFC568BB868C810C79CD4E0312F793C43E336087B5A6FA97A90E23AC759DE28C5BA40BD753A37377DAC4D95835F7FC066352983A2661F7976F99AE9D148E5CC50130FC834AE7989ED9098C61EE67096F6A5E6A8F7663223A9C0950E4552A71B7D18A3ACDF7B34009F3DA5382D20A4B0B768D61CC37E55DC1401E1DF5CA502E3307C0A3F7F24E95270280283F0B1F5760942D135F1CDD1F08C25E43A2159F9BD7D0B46718F1FB9DB258E82BA4416247BF60BEF0522F5F43B1A811AE60C96F716EE9C2E3855698EA400433889BB3B94656C08E0B0F20F6403F8D5014D2CC2FF0E75E5F6CD8AE1567CCD3510A208570781F00280EB10BFCC57CDB5531B0F17FE67CB3B0A315C0B0C44EAC59F7326A3DFD351AF5DADD76625E8BF36C5633EC792572021E7AADDA8FDFD9398ACC6EF1EFEE2FC149A4D43969D7DE655C681D1C8301338F53A7F3EE78A051EF487788DB49710B5EEDFBCC2D05E31334EB144A36A2CF434B39E02516516A02BE09610F37BEF8A2668A2F2D9AD3F5572B35464AF201829B02BB42211EB5D469AFCC4EFF6A8D27DAA44FF1906777B4A1FAE1483722793AE12249833DF69B0A44 ct = 6CE396F4233CD5B3176D8890A8EC911DB48E12A75451816010F85BD40E96906190124A4ADB1031DA9CE72F932227838A569DB992920B0E346D8C92AC493443E425670F9A0064007C192B31824A12B03B321D3C44ABCBD329A5AE1FFD8B4AC38AF62AC269CEBE10DDE56B28C4DD027634EE39DB4F82D89E699BFCB8672AF7F738208689431C3E22AA5449EC3CEE38D49BD4D809DE910D0972FAE135A0BC1E3D5B70B95824981B098E275FD1E9EEB8C60C4D2563673E9BFB257624B50EE54C054905AFA6614BF3A5C92C625F8308349B336CF352923AD1E6378881CF4CB2B67CC7E6D0CC73E281F3C0F6D04E4681BF9647455F0FE0CEDEE427F0CB873DE908EE0D95A6970256744384D4DCF2F9A76A8B563FE47FB5EDACCA24255380920B01C114C3F051C4FC0B16EEAC99EE72B5C60426093C4AAD54B0C049A3C77AED5B38C2B17F4A268A847B574255C5B5D229D87B9924FA2BCE0D851FC5C238D890FF3C05A0246EE748777A4C5FB49DE4BB1E5583824E3D18FA87BFA210DC28C0F8033A6711B5900F175CFF7F9A8B5EFD43B430670E749FAF0C3C0172274309686ECBF3CC70E748AA8E97B38B6FC6401A0A77007B731CEB43BF80D0BCA0EFB450D7BF41E4CDFAA40B8058AD8ECEF983B786DB39260C4931E9927B5534DFF970C3517EBFD7B2F383D70832EBED1E519B5B572E8D069D6080185D69A7768E9C577819E1CE4F46A1F9515A5AE102CDB97618F5497CF047DA5CA915B409BC63A4D24EBC92BCDF7C4B24D449237A025B8EA1E3EFEB144A38FBA64D45E71F8E5087C9BC920DDCBD77E47D9262B89B6740A7E463C16BA436D32B8B0A52 ss = B209893563C3F7461EA1D541367EB5592C42A6372846C50D count = 90 seed = D26CE360D399BF7B89DC364AA7AC06BB513EAB8F527383E93E30727EDC3F22C262AA0EC70257B39EDFF0630DCDC1B79A pk = 9F16EE51D2A511AAB706C75BDFFF378AFBC17AF2E8D00E91A062B53F4FBF64CAF1E5C44224DCA7C57CC5D34E87BB3834767EF39F33D548D8D309A11560D67F2F0A9D0F476B070B7519C838B4D87B285180DA85548F14759CDDACE28330586504E12E919BEBB2B0DA3CFFE9666FCC3562163C0A78722C5501BC2EE693C1E649DB0293A55780AA8055B9CA3EC000612294A907A0C2C1A7C3FABF8BF0295ED8F67F0AC920E55E1B93B4CE4183C5A5D1E163A18F3CF86E65875DC1B9A425A58DDF235189C7A4164E699D3EC5313403CDDDC91A34E20321F46B8DFBD7004CFA5E1EBC703E2721E4ED170B6BE7C1BD152A2F9FD90827AB4E025A0692C8D5A17DD9C270974008FC919E42BCCE65331F39D8DC9CC62501F8CDC064B45C52EB88AC6A950610D885AED5D287732FB402502183BF349568486CBE41431E7E9E760B1AF18EC44459617B5CBB5E590C9B4F156CF019DB538A919CCA6FC24B2B380BCABA616F333FA548A42C7EE2202C452023FCB88054B4757A80FA69E80BBF925A02E40F8F508CE4A70F0C794516BE1B7DA9C20E72282D46947E6D7A35300B6EE7746E0C7D54822DBA3BE2153192EF8352172A1C5EA0EFFD48E5A4DD2D715167EAE71D53A00C4F46CA7527C7C92BFCEB281F0DC93EFD31CF49E28F27F95DC720E3192F2DFBFF37C068DA57F2B30C9D067C7486595E9CC93DBFD8794CA7B3DAC8A931AC047B817619EEB010C2F2F35EF05AB69500E8D64B3D79ACAE3FA5E03045E52BF41CAF6041C46FFBDD859DDF806A50EA430797BF8D4B4F4D sk = 6DF4385DB978D27B27D2AA5E452E4152B36F097503D9581AC3390105C5727E7DC95FA08ED106CE84660E8A4C90BD2B22634E40769AA0090A101C5DDDAD45EDC5EBE6C48C21012C2B18C5AA931733DB019F16EE51D2A511AAB706C75BDFFF378AFBC17AF2E8D00E91A062B53F4FBF64CAF1E5C44224DCA7C57CC5D34E87BB3834767EF39F33D548D8D309A11560D67F2F0A9D0F476B070B7519C838B4D87B285180DA85548F14759CDDACE28330586504E12E919BEBB2B0DA3CFFE9666FCC3562163C0A78722C5501BC2EE693C1E649DB0293A55780AA8055B9CA3EC000612294A907A0C2C1A7C3FABF8BF0295ED8F67F0AC920E55E1B93B4CE4183C5A5D1E163A18F3CF86E65875DC1B9A425A58DDF235189C7A4164E699D3EC5313403CDDDC91A34E20321F46B8DFBD7004CFA5E1EBC703E2721E4ED170B6BE7C1BD152A2F9FD90827AB4E025A0692C8D5A17DD9C270974008FC919E42BCCE65331F39D8DC9CC62501F8CDC064B45C52EB88AC6A950610D885AED5D287732FB402502183BF349568486CBE41431E7E9E760B1AF18EC44459617B5CBB5E590C9B4F156CF019DB538A919CCA6FC24B2B380BCABA616F333FA548A42C7EE2202C452023FCB88054B4757A80FA69E80BBF925A02E40F8F508CE4A70F0C794516BE1B7DA9C20E72282D46947E6D7A35300B6EE7746E0C7D54822DBA3BE2153192EF8352172A1C5EA0EFFD48E5A4DD2D715167EAE71D53A00C4F46CA7527C7C92BFCEB281F0DC93EFD31CF49E28F27F95DC720E3192F2DFBFF37C068DA57F2B30C9D067C7486595E9CC93DBFD8794CA7B3DAC8A931AC047B817619EEB010C2F2F35EF05AB69500E8D64B3D79ACAE3FA5E03045E52BF41CAF6041C46FFBDD859DDF806A50EA430797BF8D4B4F4D ct = 6992291A260A92D80E600E17739F6E67DAF2EC59F958A9B5BA3C042805031464E496D8559E159F5502905A0156C259A9DCE65879C79B9267CF30DB44A693CEE9671C7E09A62494854909EFEDE4AAFCC40B2DB18248DEC8A49A2A198D5830C031656A74ED985C46AE459FDA7230FEB28B13FE8BBD53876A68FD4BB48B7AB5C920568EFF899FD968FC989EB5232173F1B6B56DAD00FD02194C2185421BAD4D37D6938C3CCF8ABA83AD2515181509FB2FD41B81291194AF6B8B51A3B015EC8797D3BFD7617DBB67FE828B8189EB1272678A9F037320657B297DE1FEBDAA2B74D637E4ECAE1ABBA41335CF06AA14DE8F37255DFBC10C0F544AB58A809BC9A03117E6BC2DBF3803F611AAD48513B7E4C7A1C65C606D19D9610AECE90CE18CD1463B0F5C4054C34CA0445AC07DCCC9A8E80BE39F9E942A20F315C10AC83618DA291FD9326A36E3B81878B6DD0E70593185896CF503FB9FA0C34913A5D5AF93718048270C94BBF20F1A4FB442B3914BCFB92968D1964C31C1FE3F5D1A4761E9D2C6A272D0C0626E6F4371511E187D103B0B55B2090F7354DE0AFE77F620FB48AE8F9590088FFF84A8D82AD5AEBEB80E1F118A3ADC910D255E593A80B2DEDEF650D3FA0F7E5E7C2F158B5433A5EA0D8762025F3DB475492C4E507BEFA4411DD660994B7858E13AAF1EFBBA127CE82058A861A6B9B2FFFB30BFF94290162F6ED40B07A93CAB08BAD48B00D7A3CCCE84B4D92940AE795A94A37FCFE8038960A1B399F3B23AF4424F20506112F1DB50EE3A961214F4BF521C0DFFB00ECB198EA5A11567EED4FA12015C0D458D23F370D1B734401588219566DB ss = 91E42475D6EDE424783731EB18394490ED90EF39C8BCC8BC count = 91 seed = C5856298C3CB6AC9787A0F30938537AB2635B96F6D19CC9522063360E7A5C88E644929D2879180E3E5BCAD2422B7CFC3 pk = B245794E693AF68E8DFAFEC79D8B00950ABA42C3B6289B78AB37CEE0B5682BFBB438D969D4A01821102B9A9854593E984D15D76E5DDA0D406AE7D4767A7FAE4E3394348EC0B7F24DF740A8FF64EE67089F46DF96AAA3326D24D220634D61D984A5D732C976C8AC723D3D011B1B877910BC68CACA316F3C56A32F2276AE935C0E87671E9C53851C9C067A2D44585D384E073C4C407943439E758866FE35710F36530434E661645434241F786AF84B32AA098241CEB0A39DFF0CB247484F181159B8A967FCFD209E2BAB2E1D37ACA6F44F2A76512E715A5B5A6073F2AA8A453A74AE494C7301532A2AD863B896B3D8755366F9763884F02E19CFBB242E2383B3CC4A810E7B7C8BB33C3819FFFF072D5D5A265C91177BA0B85F950631A5DB0B263AB7179FD8D30F8364FEC1068B3EE26C89AB1FAFC06A1313E58EC623B388A1DD8A2D4B1511F338AE2312480E9032C44DA5F81CEAE016A76A2C93B3DA7C9214C670A0C1A0940723CA2C9E0C7BD6B53E1856126E5C5187DF7C103D3DE52135751AD42AF5DD0C93BF7FCCEA53C74394284D1E00384683DF201A69805E71BFA3572F526FA801CE92506E3179C1DF18126AF235CC31636DD7936806F69F5F5B5BE31DBB6BED11BB30A1C32652936A0E6A9382F34B3ED3747A0738358E98AF3ADA131A2D9267700F4F5436A782B12A1954F1D8A03B603D86C1D2C7F2146691C9AD218A70185A5B9189FF754E25369A2BADC43EA3B06970259D43A84F377323EF2D63E7EC910951D8BAAFFDD5511A7BE3BABD6A300492F867 sk = DBACBA825728444921B227CDBA54446B3F6881B47BE9CD02832F78B023B1BEE0E15274A8E2BC08FE818B117BA28C5DFAE74D54FCDF6F20052F79BE333EDC8DDED341361D7317C5D77217C8122A4AB402B245794E693AF68E8DFAFEC79D8B00950ABA42C3B6289B78AB37CEE0B5682BFBB438D969D4A01821102B9A9854593E984D15D76E5DDA0D406AE7D4767A7FAE4E3394348EC0B7F24DF740A8FF64EE67089F46DF96AAA3326D24D220634D61D984A5D732C976C8AC723D3D011B1B877910BC68CACA316F3C56A32F2276AE935C0E87671E9C53851C9C067A2D44585D384E073C4C407943439E758866FE35710F36530434E661645434241F786AF84B32AA098241CEB0A39DFF0CB247484F181159B8A967FCFD209E2BAB2E1D37ACA6F44F2A76512E715A5B5A6073F2AA8A453A74AE494C7301532A2AD863B896B3D8755366F9763884F02E19CFBB242E2383B3CC4A810E7B7C8BB33C3819FFFF072D5D5A265C91177BA0B85F950631A5DB0B263AB7179FD8D30F8364FEC1068B3EE26C89AB1FAFC06A1313E58EC623B388A1DD8A2D4B1511F338AE2312480E9032C44DA5F81CEAE016A76A2C93B3DA7C9214C670A0C1A0940723CA2C9E0C7BD6B53E1856126E5C5187DF7C103D3DE52135751AD42AF5DD0C93BF7FCCEA53C74394284D1E00384683DF201A69805E71BFA3572F526FA801CE92506E3179C1DF18126AF235CC31636DD7936806F69F5F5B5BE31DBB6BED11BB30A1C32652936A0E6A9382F34B3ED3747A0738358E98AF3ADA131A2D9267700F4F5436A782B12A1954F1D8A03B603D86C1D2C7F2146691C9AD218A70185A5B9189FF754E25369A2BADC43EA3B06970259D43A84F377323EF2D63E7EC910951D8BAAFFDD5511A7BE3BABD6A300492F867 ct = F2E3F4FBC8D3091CE5B47665C9A58AA76C09C28C48A6C18F5722ED031606E6A10E8DBE5AF9581A4311B6A7ED04EA69A5165C7F1F6F841A5A5B351BD0E4D6AB1B1E7979CB60A35A059632ECD1B4F97061E7DD5CFB39E71FBED9C4DE14300292405BD1FB13D69E58C15FCCDA2A3C65B33F725BE08C021DD2857D3CCA0DE7042936D59BAE235D40A884AC74015C80CB072F03A0C9BE60333C6948490D08174F52FE6D955814FC82FDFF185A8E98BAF6C6F3F7FFC51713D823FF7F0DBF129207351C6DAFD007BD41E7327BFE3E8986644B90D6F6FE1471073C00E75D7165EBF0E7977EAC819BA0A0CAC161CEAD1FF9F265043203CF21EC52FBD16C2DA57F0D5DC59407672C6594AC2FF0417A6456D28520C4D8EB23BB33AC7FF4093EC4B4488ACBBEFA455C79C5C28BA7010F9054A5B54D57B8E5075471A8553620F6AC7A9A994D8881DD3FD04190E8B8DDD9E86F2F79D3CD0AB63BA05F365F4B83CB9A0B01B357C410BB8F61662C9910C815E0A1EC5037E8C18C530E582BA45FF1475B893E59EA45D85DBADAD7A068B4DA55626ADE9EC823FE101CCAF34474460DC48BD57F3848CB13DF108290452CB85B817320CDCBECAC14C0A9BE3AEDD5D633C0EFA5948FA6409EAE1B82136B659B494425A670543B0AF0697725652DFDE37DD7D6BA57CA9AC11066EB217E124D1F781D709F5B93D0384AD22F651696EF083A0CE18391AC00395416366AB8C8C86F4AA6428189775413364CED6CA056B9D42662D3829611E2523B6E5B9D5045AFB028E6F6EC97DD194CD6231F577211687B9EDF9CEE5C410247474C89DD2023993B55C1E202D5C261001519AE1E ss = 362BEE387B12AF4771EB7CB33A47325725FF1AAB2FDDB44A count = 92 seed = A28EAD0A08E7228AEFF602B16A1E752278B8ED1E91DAC67994F5ADC372E1D82F95CC390CD97AB9212275E0566C833FD8 pk = DD23CB40EF5261C76DBC99383DE08E586F6E27FBA48CDBEB492FB4C917BFDC3CCA91184CCBBDCE967BB886AD2D5FF420EF3BFB9ED1191D0B882646B8A18BFB0BBDF1420B8884BE70B1BCA7EB9868ECF6470763CD52DBA024DE2D287C534AD8C5636E3B867CACFFA792EEBB740E0E9051030B2B140F8D8FAD7A0704485982AC84EB5F53EB78E038FB3C15093F58A1905BA83AD2264BBFEBF6107CA410BFE995334A23C95EC170F6EA7500C8548717497E8A6778936CC09401460028619FB07A05C40E2682B4C776AA9D0ED6C965A55CE166F12A7939FBED46B36C674EF95E896056DFE271F624B3D6AEB6D2A7057764F12449AF33F79E25463A9D9878DA1A8C376B47330172BF0865EDA745392B21628254E7A5507114257B196145699256C63EC6F71E4D40B822E1691C508F6ADD49986A0874C24C4B2A231145067CDDDBDF03D335DF39893EEEA8B918A100C6EB096DCCC1F5D21CAED986DF6C6086036D0D922A2DCF7969472666550FC6C40AEFF5A2F873C113A2FD620977C2D01E083D9260D193AD4EF3600D3DA2BFFCA6F4897DB64BD55BEBD2E76F348AAD6852BE3A79B55E4FC39DAFF2757DE0CB45C1FBA05C2DF40A269412C232DED51798B9E3E63D775188B9E7614D23A85100093DB0558A473C7BD14E6F00F093BFCDF3CFB8FD5A456B981E7876CE35FE644826C1F71D6B9FE0E702210A98DCD39ABA0A178BBCB73D2BB94B55529235DAA10498795C30111774FDA6D158DB6EDC2C597DC4BC6EB500052F42B2ED19CEFDC048039A1472733EAFF16E60 sk = 690EB71FD7052B906EAEC09937A8ED374E0B02AFA27C2F14399932BE5839FAD281C38C2CB5CFAFAC81B96A810AB749B61806B6D54C9F8CF4BF1BE0192423288F6A9E55D6AA936CAA943911DE027B9803DD23CB40EF5261C76DBC99383DE08E586F6E27FBA48CDBEB492FB4C917BFDC3CCA91184CCBBDCE967BB886AD2D5FF420EF3BFB9ED1191D0B882646B8A18BFB0BBDF1420B8884BE70B1BCA7EB9868ECF6470763CD52DBA024DE2D287C534AD8C5636E3B867CACFFA792EEBB740E0E9051030B2B140F8D8FAD7A0704485982AC84EB5F53EB78E038FB3C15093F58A1905BA83AD2264BBFEBF6107CA410BFE995334A23C95EC170F6EA7500C8548717497E8A6778936CC09401460028619FB07A05C40E2682B4C776AA9D0ED6C965A55CE166F12A7939FBED46B36C674EF95E896056DFE271F624B3D6AEB6D2A7057764F12449AF33F79E25463A9D9878DA1A8C376B47330172BF0865EDA745392B21628254E7A5507114257B196145699256C63EC6F71E4D40B822E1691C508F6ADD49986A0874C24C4B2A231145067CDDDBDF03D335DF39893EEEA8B918A100C6EB096DCCC1F5D21CAED986DF6C6086036D0D922A2DCF7969472666550FC6C40AEFF5A2F873C113A2FD620977C2D01E083D9260D193AD4EF3600D3DA2BFFCA6F4897DB64BD55BEBD2E76F348AAD6852BE3A79B55E4FC39DAFF2757DE0CB45C1FBA05C2DF40A269412C232DED51798B9E3E63D775188B9E7614D23A85100093DB0558A473C7BD14E6F00F093BFCDF3CFB8FD5A456B981E7876CE35FE644826C1F71D6B9FE0E702210A98DCD39ABA0A178BBCB73D2BB94B55529235DAA10498795C30111774FDA6D158DB6EDC2C597DC4BC6EB500052F42B2ED19CEFDC048039A1472733EAFF16E60 ct = B330F9D0796EB926F542746247108D60D8D12F4A1657F1CB1485F2CD8922492027C108218A73792ADB61CB17E249853C2613D2621A23F27683CB5B3B00D0E3DF66CE0647BE693FDF367D25C8835BC0FBF20D79E997178958B26119A98832A0CA071516DE275C5FFF4080A5A8772CFD35FFA0D07311A50AA4E5B7972051DFE31F4AAAF2E7A8B9008E64C94F56EF5B3963B09DD2414C3122AE257405F9E5608C5645AF3A700613A667F3F158E891D3F47578487FD7CAB1659AB4EB5514F673D8039750F26457190ADB1845D39EC383C4F5A5C2127E87A51BA8FC9D3F2BBA2A991318A6DE0B6D36A909ACC388553DC02CF28B69DECDF105E3A4447234916CB7896120282D405E445095632F9C4F1D348B3C28527C5E0D9F3532D825F14B217A41E9A1C32E53D52EF17CA6338E59CD120516764444297D11157DAD4BC1E77A01B49ED670D6B1F630E57138F824683E800FC5440AF0DB033E69D57FFB7F4B82615CEA413A1382DC533BE4AEF80D97EF8C5A8ED2EB0213613C8456BEF9B016831B2A99AB4EDB9AFC75BB132E2A5F80AD17697422E921EF8EE77BED364AC6761B7019EE0B69BF47921AE35A6FDE72A9969968BFBB1AF2D793EE6383633EEC3E081F8499F4093013ACDFB9F072C3E6261DF79E512F3A57F5846B61E75B2145D977DAD185061A59EF04E87D744997D19AABDCC829BD4EA6641FA43FFDF0286BF3182D981E2B5F9AB1EEA8A8E647670B4F9F15BD1F0A6ED3C9EA06E76A7E01B69F06018C03EA9D623A0F7360577812FF40F577EDF14DA0CC20B2F14598080C133C0FAE4BD70841C4554FA972CD9EDE0361A6F4C6595FDF3221 ss = E0C5C11D8203F126E3203F002623C2E4F97F13CB08DD148C count = 93 seed = 92877D706DAF88EF3412EB143DB8CD91BC047A9A43B7ACDAA42523560DEE4C172697BE4332042FCAB91135839BF74AB2 pk = F37F29C528BCAA1565E817E17A42AC91608B57AB2A706E141D9B57F2D4235D3A118EEF6D843AE97467650D2386C7B1FE5A4C5B10802EDFD27DF25B57E525D54EACCD06C1BC98839AE671CF76379E939CC1299BA062DB15344432147D0E10AE4EBB71F469B4A744E2D133CF5E86F7FA90636E708EBEB0E1454C6B83509ED789AEA68ADBB49036779299D27D508559854A77647994C3AAD5D875A05BC8E7C06B2225AC2EC3536E340666B898076328E0B70022FB8E089B396A4A89733D59347535E6B229952F8C9EF78EBAFA352FDBB61DB3FEF26842470E4B1AE789350E2B5C319AD0E1A51BA28353563E212FE4CB0156BD6B1B7EF4233832D48FFBCFD23C8BC99BD4F26C91C4DF4B2615C9481AF003F367DBC18865B296237F64B0ADD716EA0F5A99DC3F009111993ED9CA1F3DBB7FFA79E9560F0FC7AA64DC5C8167871A954440561916772EC848B74DB4200CFB6C122C72BE5B3C41E72C474B63570604530BEA05FF602710596E7D47F1D86DBE637D774B5A65351A062707918E6662CB5DC6031853F292D6D096CE798EC777841FAC651C15BA72153C9DA1F3D0A05DF2CC0973B3730E68488098CB98FF9497E95F02FDE288B36CE4515E467965D7AEC787C5775EABBCC8246811FC24F6E7F14604F514917C6B2E68771638956C2AE8A0B707B9FFFB28B8F6E56376BCAC0AD4F51E4459BA01136E463CCA2F694907A1397F4D3E39356E6EB17CA0216022B0A0FA6E99F7354909A0D1A8CC6DA5945B6FD3D488596691D768B4A4F552BE4B2B5256AC6516DC9246 sk = 32E0EA9089FA928482C0770DA545AF1BB871A03CE38604138B0D08EA2A10CA2BC06C5BEF7B6508409DAF847A64C8D30D0974FD3BA7476DC76C46B458A036D8844F53696845942EAA424C6F6CCC89B701F37F29C528BCAA1565E817E17A42AC91608B57AB2A706E141D9B57F2D4235D3A118EEF6D843AE97467650D2386C7B1FE5A4C5B10802EDFD27DF25B57E525D54EACCD06C1BC98839AE671CF76379E939CC1299BA062DB15344432147D0E10AE4EBB71F469B4A744E2D133CF5E86F7FA90636E708EBEB0E1454C6B83509ED789AEA68ADBB49036779299D27D508559854A77647994C3AAD5D875A05BC8E7C06B2225AC2EC3536E340666B898076328E0B70022FB8E089B396A4A89733D59347535E6B229952F8C9EF78EBAFA352FDBB61DB3FEF26842470E4B1AE789350E2B5C319AD0E1A51BA28353563E212FE4CB0156BD6B1B7EF4233832D48FFBCFD23C8BC99BD4F26C91C4DF4B2615C9481AF003F367DBC18865B296237F64B0ADD716EA0F5A99DC3F009111993ED9CA1F3DBB7FFA79E9560F0FC7AA64DC5C8167871A954440561916772EC848B74DB4200CFB6C122C72BE5B3C41E72C474B63570604530BEA05FF602710596E7D47F1D86DBE637D774B5A65351A062707918E6662CB5DC6031853F292D6D096CE798EC777841FAC651C15BA72153C9DA1F3D0A05DF2CC0973B3730E68488098CB98FF9497E95F02FDE288B36CE4515E467965D7AEC787C5775EABBCC8246811FC24F6E7F14604F514917C6B2E68771638956C2AE8A0B707B9FFFB28B8F6E56376BCAC0AD4F51E4459BA01136E463CCA2F694907A1397F4D3E39356E6EB17CA0216022B0A0FA6E99F7354909A0D1A8CC6DA5945B6FD3D488596691D768B4A4F552BE4B2B5256AC6516DC9246 ct = 1C4A9395CE1EF6AC71188CBCD0C9980060671FE8D28B9952EC76930FD1CA746F718E80D18160F6BAAC299E9C28712C1856684B7D6518872B2111F8A10500F35728BB72416B9481F0662341C2D79573C84C1C2001AB1D25EC227545A29E585D4A923CD614C4A9DF68DE600B609E4506C5B86D94B1F0AA95373C02C4AF420752AF08532423A517C73435DC4167D20A846C3CAEF0295298986CC0DBBAC4B31306B37FD6851073F1B7AB6273B1066183EC9B06BF272D8AAE505C2E64B0616E4C12AA22CD337667F66964BBFB0079F4937032FA8BCBB81E1C6516A29EB3CEAB0AABB8794B914126C804667DE91A225944329DEA854CCD0440371FF289C309D81B8C127E6D656C00AEAF5ADE38A47B8921B3320BCBD22E238E7FFE3D147B99912B5E365957B9AB92376A3EAE5089D677A665A92A07621D8F48855A9A464E1C1A181C15CC4162F12B17F0A5E4F7050D1B135C8A41FDD5C7A0A5DF6B3B31113F86D7E484E31185ECC5D921408D17EED06B9B890FC5E61F997531B847BB2ACEFA450643B7ECC418CC93640C71FAE5AB8BA8A48870073488EA9695D7EFEFC6DAB4B613A28A4B4BB16B0E4B34DFF260C6CE58943C253A7A379CA7B75C4F03FD51AF79E520C8842D20C4A75EDB27616E501633B4E6DA6065EDFE6D2AB3B16E608066BD33EA68D9C9C302B2E4E8E9B20F4B9F900CE441C628A082D306C54C550DDB64E1FC5232901D7BB09EACBC341440143BF1A00A819BBE092E5768048A8158DC9BA0E1DD7580EEB0FB66B1EFFAE47A68366CFC42052CE3A4481CDC14BEAD854E792173CC64FD800A22560F48EA5474A7E42D83CD405B803784 ss = A0CA19773619BC27A6DE75342C280852D1DAC149066A0BFE count = 94 seed = BB4C0082CA4044B1FF60B036C9B0E0495D58667156786C530BC69D949A13BFAFF53798E456423D7A0E162A60039367D7 pk = B1B4EC2A554B9B14B94B2F5F5E7339397EB67764FD8B9E474697848EEF40740D0D5E23548D83E604933761215C7D8976446AEE104F488716AF959607738A2C77E3C83A7BBCAE054AC904569EBE6787BE159633214CD0526E82CA488B2D05F3E8EF2ED53B93888134C36D909BB53C931CE0DF9672D7EDF8CE80C7235471EEC9A9BF4BFEB59FD66D1BC9CA16FED7136975A9ECEE78D23237F60679437C70FF58142BAD1E07EB218524CABBF299D63F00C01CEA080E5EB455FBC1E0195230DB38D8767CFD1EB5BDA725741D868262AC3B9F207EA6EA5DECBF238E8C95FC4415EFC6B577816BE1DD825A914F93B2F660C7305D484E8248E2EC965AA43D2CF1D8457736EB1C14C00E028E35EF9C03977FF06CEAD4249D7F6A32FB3E06C1D2B076896CEA37584C9FE910ACEC0026E95713875F567A92DB2FDD4AEBEAB6C8B15F92434889CCBA47170F8BF45CB4CD266797EF51ABF49834304A0A4A284BF56BAB67AB7815F710CD3F80368DF868674C0EDE22B4F06EE76A83F2612AC723DC351ACDD3AEB1476A20969F6BF5F09B5EA2809903787513823B88295AE62DEA119FF98323BD5C87710DE8800EC018D45037508186A3E4F3CD3047DEBB69A4B5FE8FF7EA15B33BBF4F8DBB70E655019C97F74CA0CDBCCA403D9BDE61DD565178E4B285C67BDD3D887774759953299C4F87F255C7DCC4AC1C9046AEAC4033D8F3294064CC054A106DEF5E055B633CF9AAFD5F874E864B9ADDF3CCDDFF89FA57AEA28BC53797020CFCCCF8B4A105F90435522F5DCF2D9C19762C2F sk = 6FB2EC719F2A0DEA152BF3F64B9D148F8AB8BA88F64E61F5DB53E12D59F525574F797C007E4061F95C7D56CFC7EE5C49E849DDE3FEA8F25E7876DF2A18515C349C03C3C45314774D82F5211B45FC6100B1B4EC2A554B9B14B94B2F5F5E7339397EB67764FD8B9E474697848EEF40740D0D5E23548D83E604933761215C7D8976446AEE104F488716AF959607738A2C77E3C83A7BBCAE054AC904569EBE6787BE159633214CD0526E82CA488B2D05F3E8EF2ED53B93888134C36D909BB53C931CE0DF9672D7EDF8CE80C7235471EEC9A9BF4BFEB59FD66D1BC9CA16FED7136975A9ECEE78D23237F60679437C70FF58142BAD1E07EB218524CABBF299D63F00C01CEA080E5EB455FBC1E0195230DB38D8767CFD1EB5BDA725741D868262AC3B9F207EA6EA5DECBF238E8C95FC4415EFC6B577816BE1DD825A914F93B2F660C7305D484E8248E2EC965AA43D2CF1D8457736EB1C14C00E028E35EF9C03977FF06CEAD4249D7F6A32FB3E06C1D2B076896CEA37584C9FE910ACEC0026E95713875F567A92DB2FDD4AEBEAB6C8B15F92434889CCBA47170F8BF45CB4CD266797EF51ABF49834304A0A4A284BF56BAB67AB7815F710CD3F80368DF868674C0EDE22B4F06EE76A83F2612AC723DC351ACDD3AEB1476A20969F6BF5F09B5EA2809903787513823B88295AE62DEA119FF98323BD5C87710DE8800EC018D45037508186A3E4F3CD3047DEBB69A4B5FE8FF7EA15B33BBF4F8DBB70E655019C97F74CA0CDBCCA403D9BDE61DD565178E4B285C67BDD3D887774759953299C4F87F255C7DCC4AC1C9046AEAC4033D8F3294064CC054A106DEF5E055B633CF9AAFD5F874E864B9ADDF3CCDDFF89FA57AEA28BC53797020CFCCCF8B4A105F90435522F5DCF2D9C19762C2F ct = E6E3F7211D025D49217153F297E872D60AEAA1953858EDC5E1796A1BEA62C67A40D867C974BE3A03136B96740160961C2E9214BC1BA0CE48AEDEAA157DF0243BD9D34AC04E39E90D676146C30BE68E7AC17F802A4815E6BF8D7F6B50605F4F51020144A41ED9FB213B76D4562040A2C57CABDFE85DD1C3B8304EF2421ADF16CEB89D64DEFA45DE7F997E29348B6253DCAEE919DE386D6FE312C6F52A088B2B25638C83C0DCEC06BBC3C1137681907F01FCB413AF46BC171B6B10890C4DF662F2DA0D70783B62ABDEA079CFD0684AE41EA15A72907F75036A88BBCCDD7DD947F1BD698D202CF37FF5F4B7635EF452B64E838061AB49DED9B92A9F722A5AF0381587871AEFAA382B3DA0A75B4A7D2707820CEED5CD282037FD122ED0B5BC755982BC6D7D342683791D81647E40061C5CD52BDFA05DE4A6B9045901BACE0C2E01C027BFFAF1F888059902A14FC2448BCCC580AE6440548FF3BC4D7FE3514454C41739EC147F43C3B2D11692F0A736DBBCD44BD3609473A17916746EEB5BDDD7BA9845C07175623FBF951B320E19A314CC24D5AFCC9ED786115D1810097C64ACE2DB18B8BB66B203997E8C924285F3B205543177A4D06D61D034B7F50D3A53A0D7B295E3B9C337E945EFB253E6508BAE7C49128066F80B6A887E6D072E73EBAC8F2563965C9D6B1B4C4F839BE57244E4FBBA516B37666E7F0EAAF8931F1A3A6361C1EBE6C1672505F5F97E02E851A3423E1FD2695B5CE2A00986596183CED634449D9055F0ED0BA2C2955261A1BF0F7991ACA0927028FE3DD5E7B3A2E19A866E395E2B11665C2AC4DE041F9B091C841217256FDBC9D4 ss = 8527540121A28DFF2BC543F0E1E46F7FE4EE08105ABD5FF4 count = 95 seed = 121D90E70AF6204445D0DEB28AC0C108262719E9FD3476ACA74BBFDE89FAF04D8D5F89A624E8A75DB80431F0D10AD28F pk = 6E3E67EEA52D71C8A14D67F59F58FD710F72B3EDC4CD178E41262FD8BDC467460EE85927C6A6753137EF2DE12D5EC4A13CA807B7B0D2005993154D50072100772A372795F0026560D1A59D3377B1F9BD66066E99789C863385B085CBC13F923EBD83E2CD2752B63BC0D66B99CF64F976724B61E270A1E980B18F53862752F5D82C79E1E12DB32A21F91C1E03682131DCC914EFE4F3D99E2D09C69A6101024D152E9B0A5982EA78146C15EBC549486EAD3490860196651704C770125B4CFF2A7E8942023D3596F65B4DF5B95F3477C7AC19E47B9DD0A2E27413B755770CA3759B31C45CA498B2F9F613C6FA6A991E1DF791C107004B77A0D01BE03782FB07E9FFCB8F3C58B96CFA092225A37AAC62B8A606399059A7102125BC0371EEF8A40D8BEC2F5412167F15DBA6E1DACA333734C3AC956407EAB87044CF866FA915FA91094F3F387408BDF5BC84F5B43D3816DA797EB6B753F2A2FCAF7CA84BC0855EF20A3DD84B6A7325CB42474ADBEEFB6E39B75B9848702E69AD5C54F241B2B90E16B1B56BE18A8E7F83B191C03B87F3BE8A9BF81C1C6942CEF633C577F98FDAB9AABD4B75204EABDD2BA3D04493D67432C5A7634744268EED2F9FC9C8B6BA225558D807B655C3E9EF526110F083F54076692AB9FAE5860D2938F9B1C0261CB0EC0373C3546EF545C31B72AE819C234D04F1CD5EAE458A1DBCB996F9040AFEC4BA9B686E301EEBDA201BDF5089D9741351715CAED17EEBBBAAEA5D30CD8C6FE60ECD3339A6B420CD8B6F9E72F3987C7E00BA8270747B28 sk = 527FB88C8BD9A4D6031DAD15E63878ABD2B559E7E08D61F69E8E78FCA964EE6AE32D432B4F9F751BDE0496C580A181FFED762AA35454A02D3F1F47EE0394C89C239FAA654A488E65167123A0737F08006E3E67EEA52D71C8A14D67F59F58FD710F72B3EDC4CD178E41262FD8BDC467460EE85927C6A6753137EF2DE12D5EC4A13CA807B7B0D2005993154D50072100772A372795F0026560D1A59D3377B1F9BD66066E99789C863385B085CBC13F923EBD83E2CD2752B63BC0D66B99CF64F976724B61E270A1E980B18F53862752F5D82C79E1E12DB32A21F91C1E03682131DCC914EFE4F3D99E2D09C69A6101024D152E9B0A5982EA78146C15EBC549486EAD3490860196651704C770125B4CFF2A7E8942023D3596F65B4DF5B95F3477C7AC19E47B9DD0A2E27413B755770CA3759B31C45CA498B2F9F613C6FA6A991E1DF791C107004B77A0D01BE03782FB07E9FFCB8F3C58B96CFA092225A37AAC62B8A606399059A7102125BC0371EEF8A40D8BEC2F5412167F15DBA6E1DACA333734C3AC956407EAB87044CF866FA915FA91094F3F387408BDF5BC84F5B43D3816DA797EB6B753F2A2FCAF7CA84BC0855EF20A3DD84B6A7325CB42474ADBEEFB6E39B75B9848702E69AD5C54F241B2B90E16B1B56BE18A8E7F83B191C03B87F3BE8A9BF81C1C6942CEF633C577F98FDAB9AABD4B75204EABDD2BA3D04493D67432C5A7634744268EED2F9FC9C8B6BA225558D807B655C3E9EF526110F083F54076692AB9FAE5860D2938F9B1C0261CB0EC0373C3546EF545C31B72AE819C234D04F1CD5EAE458A1DBCB996F9040AFEC4BA9B686E301EEBDA201BDF5089D9741351715CAED17EEBBBAAEA5D30CD8C6FE60ECD3339A6B420CD8B6F9E72F3987C7E00BA8270747B28 ct = B3BE2626AC5C6F17EA0D18BA7791FA1FD8A84EF0ACC64B7A272078DFBA5CE0D20A698E652B7D09FE5967C13414C4F9BE4ECCD578EF72D938C619669C89DCAF18647A08FF54C3052FD9EC8F4C787446295601363778F5A7FBEFAFBFB10367F3007FE3750DE71114818AB8C1554E320BD7B94B5FD038DF1CB17BCA99C56E9FBE4CA94523019F0F0538CABC4E32966B40A975D2C0F25FCF04BE04AD932F24ED54D0972B8CDCDAE4F3EC235B1C8768E475F091B0F2F2EE89FAF6C877506B457DAFFA080A9ED8D12E94C33E9BEB45771E6C8FA9A63BDCC595D3F0417A9995B0DD8CDED2A33BA7D9F307F609FA4E1F4E2AEBD4949BBB065010779F13F28DD5316999E12BA400A4F11704AA11A58FC0ED16A1F85410ACDB2350E4E18A5719433C8D21728A783A39911B4F668EA8D22586D34AA1DE71A5360253161BBF0839332EAA1F6C4970DED2EB41CCD0877A99FF7E78FFB55D876647334347EC37130729E068D0ABC9740EB0A998F1C2E5C1BF93C687F826E7F9926BFE0D485956E047B0ACCBF6902F4D3D1FF1FC7B80483FCB4C4D410C07DB105769141950F0AD40D5E0CE300994DA38078B0642D028741478D1BC508A858B7567AED898D052D5A3D8512CFE501A01A85A7FF9CF5BC065E8D2C31ECECAE0088CB0BEFE0E75D751CF86F696C83ECCED24A0C1336B8E29E2775D65418488A77F3B1386C9A85CF369596925E80E7C18247074F8DF5CAEDF1BBD331EEC4E253BF33F95214445B65E322CBF90B6681AEA873B278B1594A6CE08A1269312F189D6941DAC33FA76E6CE7FF4812A189337E36ECFB9C6C6A23482FEE3EC0CE7D252E3D164F973 ss = 69D2682DCDA60B7343293151F9596B023D2976AE65B83045 count = 96 seed = B3AC6503206ACCC2A92CBC210D020A2654726911D11CE676AA04FEAA08AF1D20C654E4105883AE470EC3AB299075D420 pk = 9FA20A26B5B1DD1DA3AA3463E444DD598C866E0333D98C5D1A7E7EC890BDC4F2B23FC120340547A66152CA0BBEE55546B4820ACB865AFEB52395AB3AFDC33E8E53930CBE7B54BC200FBEBB2F8DEB9C2AA8A5DE71E22278983BF781C7755E232860B0EA388FEBF0556A0205A635721E0E0A6F71C870F9C10BA6DA852062E75F363E0B823A75C5D2CFF26C90623646AAF792EDE9B4D9C9ABDA06190CE486AD467838185619611C63D99D0A7FEBC518E604A012A9D295BC698A386DF240F3A68DDBE7B2A4672988C0285F9D7660C2F06577A12563F24174649403533657016CB8E8F2BF3F2F3C83E4EFD3DD22F3DC0C9DD954A7351C377D74B60B96CC876020A62DFC1BE9FDD89CD26EE765C4F551F8E713EEE7CC4C2A815F3686514398230F714DD57C837E4C1E3A7916A7C95BBEE251C1446542DD2A793F4CDB05642316CF244D52472E50DA716A63907E7849507C81FFE75F0B3315195DB4EDE0BFAA2006A8DBE346913AE1A1E89273AFA67419F053993DFF9792CF76E2599CF8FBF6072B22A367CC8E83F8B18DE6DEE3EC9DB2B690D2D3A37E2C13B58AA3FF473ABF34B576D9956C8FA56C28347D313D22ECD0ADBF897C39473562CB43291C917DDC045D9EA8BF228FA22097A6827262739DC3EBEF681418B02884678557DFB886F5CBE401C04100FABC35E6CA4C442901DD6AE15D23F7C1B21B19494A3880D0BDACA4C1F96BA6B941A36E6FA09C5AEC008377D0E45DA2D367A820803E3D00AE49800633A6EBA343B7CD8CA1F6DB6ADE07FD6389306971FED22D sk = AC6FCFAEEEF795B6EF9E062F02BF42975FA01E7D91BA832F74E05269A72684D05AEDA108EA4D6C6BC0FB958286850422BC357CA67B83C986048E0D0087FA11EC67FDC3F209B930E1FEF9E3B9A07788029FA20A26B5B1DD1DA3AA3463E444DD598C866E0333D98C5D1A7E7EC890BDC4F2B23FC120340547A66152CA0BBEE55546B4820ACB865AFEB52395AB3AFDC33E8E53930CBE7B54BC200FBEBB2F8DEB9C2AA8A5DE71E22278983BF781C7755E232860B0EA388FEBF0556A0205A635721E0E0A6F71C870F9C10BA6DA852062E75F363E0B823A75C5D2CFF26C90623646AAF792EDE9B4D9C9ABDA06190CE486AD467838185619611C63D99D0A7FEBC518E604A012A9D295BC698A386DF240F3A68DDBE7B2A4672988C0285F9D7660C2F06577A12563F24174649403533657016CB8E8F2BF3F2F3C83E4EFD3DD22F3DC0C9DD954A7351C377D74B60B96CC876020A62DFC1BE9FDD89CD26EE765C4F551F8E713EEE7CC4C2A815F3686514398230F714DD57C837E4C1E3A7916A7C95BBEE251C1446542DD2A793F4CDB05642316CF244D52472E50DA716A63907E7849507C81FFE75F0B3315195DB4EDE0BFAA2006A8DBE346913AE1A1E89273AFA67419F053993DFF9792CF76E2599CF8FBF6072B22A367CC8E83F8B18DE6DEE3EC9DB2B690D2D3A37E2C13B58AA3FF473ABF34B576D9956C8FA56C28347D313D22ECD0ADBF897C39473562CB43291C917DDC045D9EA8BF228FA22097A6827262739DC3EBEF681418B02884678557DFB886F5CBE401C04100FABC35E6CA4C442901DD6AE15D23F7C1B21B19494A3880D0BDACA4C1F96BA6B941A36E6FA09C5AEC008377D0E45DA2D367A820803E3D00AE49800633A6EBA343B7CD8CA1F6DB6ADE07FD6389306971FED22D ct = 8B6417C9B51A1DD853EBDC78DE1F120B11904F8713B4F8C6C3E7985DFC67842457A47D2B0DD275D0ACD309BC8CD2DF62E437B4D1DA5A628EEFE241A96AED76E9D6517AEBFDD70F9E12924D835AB6315F20B9B5996302DF8A46193B70F0659735B7B835D52FEAD9F0A9F97DF969D0DA586DBB6ACB9EECDA30ACC3C7A3F4DE0C12364F77A366E9F88652EBC326B6A10BACA96BBA4E39C97FEB9D612389B401E35DD7F33188829DBFF9C2BE92FC2D68892214794DF16D94847EC75B710AA415F1168185020C33082BE40F6B17564AE1DF8B6DF5A81FFE9806C614F79AFA3ABCC69EC251A07E1E45584E25AE6C381EC5C0A036910C1162C076CE50571E07E61BE40FFEA3BB6AA4F841EF07F63F41A32225F74376DC636FBCCF43CD65E620CA8EEF8EFB5B337D5F791520C7F4E2C85FF0E775892EF2C179F6FCE1D54A9A69B15F3193D2FD9A5AEBFF9E256C6BAB2D6B251AAC808CD119B28EEF513A95C6933F355247D4BA8915E90C2C823619178DCB5B3CABA0CCD7A0906DB31C6837B6174D7737A1805DFCF5BF9BE2B560FC50DDD730C60B082150588FD3762E83F8D7E51B0224DB2CEC98E1D8120ABC47B0175971A98C28188E5D4B308C1B9C8FD0E96D16498323B319A101C57F426E59D9FA18C823E5B16F2C1978CC33090D96429065B466A983AD096491DD3B3533ED37DCF66374CA3ABA8A526DE1D9C167EED0DB79B3E3AB279141BD2C4C1A698197452D51B2530800E5A0D215C49468463A737B0E0325A89F51EE594334A0880AB2F05AADD2219853C785923CCF3E3903F281761EC62B00F083204DE501205B6D8BEADB82B0E19DE56B255082 ss = 1C22BDE5EA95F4955D68095B855323C5AADA19F6B876D0A2 count = 97 seed = 59EFF60B1EF6185DB34EE1E3B1DD2F159106CECEAA79BEB74923B4F5623D5BC52DBF5D2594A1F7C6C64D12CF144E9ED4 pk = AACA3495AD3B8408718C964BFB7B7421B4E734954F54EBA3D4405E41073B6DF5743A6742373693AC2A06D11BCFCC9E3D54DB29EE0CA6FBB414CEBC437E186221A788C881ED372E6915FD951CCB464F63FDD338A256BAECD7B89921305842ABEAA844D596C27AD2FD3F75F3D83EC7AA30CBFF5DE203D4C54012865D1F740DDEA9D7888BC339CFD9513BB4F3C7AEA45DB2015A92C1026CFE1B94308FA30DB3CD55467457C82D49847F6E9C3081047B9879A7CF101553595FE72B0F4F6CD89D66E4CBF23B0ABE01798A6BE692F30D6914384623D394D908D08A9A484AC2CF2ADFE6753B3F47F69E83B8AD0771D02407EF72366C2863404ADA316F18FB2BFA1BBC960BA62079BAB02C9F3F21CCFDB92EEFE497A31DC4216D599DFA3B6EA673D32C291DCC5094EA18276F6218D6ABC24D4D31640E0BBA61DD3247EE14E5DFB1ADDB6CDF3ED2043235EF227D271EA1DDA03198B0C14BD2E25C7A80CC403A8ACC58C81E3BCC2948D241797CC332295950E10C8631477C0568B8D15BAE37A21D15A69F8757360456DE489A54B0154188F770944B374048FDDDBDC590EEA481BBE141E722E2F9350B48FD2BBEEB1EF72C0671720D9E1690D7C5261FF3F6FBC6D5B4F472CD6E254948D0ED8CCA96819F64DC884668506A00E30F09D2932BABAF989C2A9BC9563EC444C6862BE2B6E7C92CF6ED308499A1C23520AED32E7165E44C98561886D1FF7535A5C1E41295C24231EE6B85685E3B1A5BA661B9D29522557C1909BF4EFA48E88222684908D948D5F57DEC4D16DBCEBB55 sk = BA2FB9318D4DBE7488057C33E95E6F054583A2800C41BB83083C330A914A12CFE63F8FFDA3565C2424C89B20974B748A65A5ABA75133FCB3156DFB6626A83BABDA6C8966F6CDEA65916F5EB3C99F9E00AACA3495AD3B8408718C964BFB7B7421B4E734954F54EBA3D4405E41073B6DF5743A6742373693AC2A06D11BCFCC9E3D54DB29EE0CA6FBB414CEBC437E186221A788C881ED372E6915FD951CCB464F63FDD338A256BAECD7B89921305842ABEAA844D596C27AD2FD3F75F3D83EC7AA30CBFF5DE203D4C54012865D1F740DDEA9D7888BC339CFD9513BB4F3C7AEA45DB2015A92C1026CFE1B94308FA30DB3CD55467457C82D49847F6E9C3081047B9879A7CF101553595FE72B0F4F6CD89D66E4CBF23B0ABE01798A6BE692F30D6914384623D394D908D08A9A484AC2CF2ADFE6753B3F47F69E83B8AD0771D02407EF72366C2863404ADA316F18FB2BFA1BBC960BA62079BAB02C9F3F21CCFDB92EEFE497A31DC4216D599DFA3B6EA673D32C291DCC5094EA18276F6218D6ABC24D4D31640E0BBA61DD3247EE14E5DFB1ADDB6CDF3ED2043235EF227D271EA1DDA03198B0C14BD2E25C7A80CC403A8ACC58C81E3BCC2948D241797CC332295950E10C8631477C0568B8D15BAE37A21D15A69F8757360456DE489A54B0154188F770944B374048FDDDBDC590EEA481BBE141E722E2F9350B48FD2BBEEB1EF72C0671720D9E1690D7C5261FF3F6FBC6D5B4F472CD6E254948D0ED8CCA96819F64DC884668506A00E30F09D2932BABAF989C2A9BC9563EC444C6862BE2B6E7C92CF6ED308499A1C23520AED32E7165E44C98561886D1FF7535A5C1E41295C24231EE6B85685E3B1A5BA661B9D29522557C1909BF4EFA48E88222684908D948D5F57DEC4D16DBCEBB55 ct = DDE378E99BE5715D3010C67A418DDFC432042599DF3A16DB0318186D23DAB6F50E9F0132755DC0C19376DD87108DD005DC5A919C3D49E115FA8B7B6163C455CE963C0B5FE385ABE45256057E72F5591080B078013AAC4B79EBABE76FFF076C01032AA015D08ADC4AE6D4DA38FD54BCF1F5A03AD5C0894A7333BC450F2A8D55C579999D0EE5AA7F7C48AE0F0AF4C3A937F4992D40C13D2607338789930CEECA6A528359B4ACEC2527C0F605022397933FAE32AB0DBD16AAF79A250E6CB6B37961F52C1A6B8986C04EC17FD998A41A6EF09D99CE27D48D63555B4447B46F4226CBC3121DCD348616D482ED276E94A97C314AE108CD89CAD1AD5706D2EFD5B7522860B3AF66EC464AEF4D515A1F0952A17A35030FBA34191C87D82CEB431C6C4D69610F89C27E9AD8A46850F101AA2973D53C2EA3A98EFB5397BE24E3F2D56D5D6B64C6755DCAAD697E4E5440CAEE161157BF430C001620CD28A89BC3C95B062164828DD8F56AEEEC70460EF739C6DC702C9F57134BE1739E6A7E648A998B56552ECD279456A16431B70E3E87CB36D1C5A013FE61D4D1B566E50CAC01B9ACCC7128CDC598432D7800AD8788853F6B0C296F8C73BE0AFE5C2D2E93384BDBF44BD55D1E189A10998A927C26F649CB8A32B7C8792739F76F39748607A2A01C536790217D12682831C8A84CFE7459FF4D38DF95858DB67A5FDBAFD899918B58FEC65375EC8F80D3E4C3943737305E4CD7533A68DF7C3F5CF1C507F8DBD7EBBD8F21154434B9D54DB45D4C4183A156E5F6D0A2F964570F30DFF5E6CDD64F2FA9508784F554B608C4165060505F9744205E8B3B38ACDBC177 ss = E22E660E9975B7696CFA260D9814A232EC7F2ED14CAB5384 count = 98 seed = DDDCA9DC31BEA737D3F474E7560B37FACB2F53C803E768FFAADE7669FF94B1D4FBD17068CFFD5DFDD24AADADA4EF6B12 pk = 600769FDFA19FC0663CF404F7A1B4B03A3FA08D6D8EEF4507EE7C41F2FF0A1E4A8C7FB5ACB39F55850AE99032AB9EDADAAEF4885CB7962CB680B22A8C65CFFE2086217E55AC49050C3A7B55E644A673D72BBC00388230DDF8B495C347153EBB0D0151DE7B6E9FB45BCC472E3CEB9184D817DC3AD3BAB85F8B84F845E3505B5C7BA37CD676B06D5B118FF172CD0462DB57C29F70E498EC1C40DC8803632F4A394A1CFC220B5F17E239552B487899835828F9A8CE855CBC42BE9723A503ECCD7D8418ED9E3AEBB3DD3798C5F5D43FCEE9374E4C3BA4520F8FDDBD7B4C640925A2BA0A53281A520F0081118366D1A1723F651E750A66E665D52BA252CFC13A46864900C7E4329AFE0491FF43AE1501C8241688A5CA3A75368B95C0FCFCD6E8893FCCEB93A9A1D45D0AA93A6B3EFA01B9FD06E1D3D9D32CF4D856B36ABBABD4AF45F15A9D55513D5FBC0EB9143393CFB9D8D2D68F9A88224243422EA99373374F822389C20FBD72C5FFB1A07227DE42837514ED0760EE9CCC1657CFF7E1D4AB368739A1BC44E823E63544D69D14C55A22DE10A81AA2C8000CA410F7FF62EAEFC8A6386DD53E4EA0B626F28999286CA5E131D2EA0A32730F70132CBE130507B73477BF316F2AE6332CA0A4EA85753EDC77D24B78552B1846514D9DE13B34EFE7F34CBE8A7117D2757B7C076798D73EC641027CB676573396442B4F7CBD1674C465C4EEBF61EC38231A6800C2AFB023BF64F0287FC613BA860EB72DFD0CB07C7976083C430A3AA61CF496C15F371E7DF8F1A870034482E sk = AA6DD1E5799CDF7AF9C4FC632B3EB9D51D66E85C8E0A21EC98664FC51AB63C7DFDA268813EFAB5204EFA60F78BF81D320D01AC09AC06244F7AFBD2D80FD356D9B7FD18E7550346EDFB273F1506762A03600769FDFA19FC0663CF404F7A1B4B03A3FA08D6D8EEF4507EE7C41F2FF0A1E4A8C7FB5ACB39F55850AE99032AB9EDADAAEF4885CB7962CB680B22A8C65CFFE2086217E55AC49050C3A7B55E644A673D72BBC00388230DDF8B495C347153EBB0D0151DE7B6E9FB45BCC472E3CEB9184D817DC3AD3BAB85F8B84F845E3505B5C7BA37CD676B06D5B118FF172CD0462DB57C29F70E498EC1C40DC8803632F4A394A1CFC220B5F17E239552B487899835828F9A8CE855CBC42BE9723A503ECCD7D8418ED9E3AEBB3DD3798C5F5D43FCEE9374E4C3BA4520F8FDDBD7B4C640925A2BA0A53281A520F0081118366D1A1723F651E750A66E665D52BA252CFC13A46864900C7E4329AFE0491FF43AE1501C8241688A5CA3A75368B95C0FCFCD6E8893FCCEB93A9A1D45D0AA93A6B3EFA01B9FD06E1D3D9D32CF4D856B36ABBABD4AF45F15A9D55513D5FBC0EB9143393CFB9D8D2D68F9A88224243422EA99373374F822389C20FBD72C5FFB1A07227DE42837514ED0760EE9CCC1657CFF7E1D4AB368739A1BC44E823E63544D69D14C55A22DE10A81AA2C8000CA410F7FF62EAEFC8A6386DD53E4EA0B626F28999286CA5E131D2EA0A32730F70132CBE130507B73477BF316F2AE6332CA0A4EA85753EDC77D24B78552B1846514D9DE13B34EFE7F34CBE8A7117D2757B7C076798D73EC641027CB676573396442B4F7CBD1674C465C4EEBF61EC38231A6800C2AFB023BF64F0287FC613BA860EB72DFD0CB07C7976083C430A3AA61CF496C15F371E7DF8F1A870034482E ct = 153F18EFC64FAA6F612AF2251A3E4111E79E226CE92853A3152EABEBE7734F4D5C0C9EC757D136E796A889FB9D2FFDF8EB5947FAC1BECC4AA6ACC01A34C76BC1DB78B7C56EBCA13C2B3EB6978D6814804C38239B0CE29EFD64438AB7FC62FCDBF1A3172809A02C93149C3204AAA2866B4732424E68522B1E83588F1177838414FD71F053327BA3715A3B4B607A6D9A22C27452CA1FAA7735D2DF46ACFA9BDA91661B3D9A7B485A0EC40B659CE037F7A0AA9E685434D9D81FA736D918A00EBDE8F307DC6E0584C54E2C5263A7048C481A81A65E36B0C24516C81E016D2921A58936F44032B8E8DD8346152E997B0223640F080A525222E1DC9AE3B77187346408E1FB328333CE1E087009CDB585B2B2E549CE89A3A3E2C161FA4AE3AFB4888AC4463A8AD2603A30C929D9AEE39C73F1C0E273E9C8DEB4BA73ADE92007B93C3BEDBE204C5ACF8155566427E0A1AA81404B1601B0C436F00960A932DEC738772C23F727BAA2B503F3F4A38ED1E059E395FF9ED4FD8D6BE301180BC9ECEEA831820719EFAC2FF30A27904EC7DA7BF799D1E6366FE6B66969789B64197A14FF58D794DD3258A5B00076560B19EF1F5D6F1C073A9F18BFEC2F506063F03022238525D9FBFB20491A0904E260AEDBBDE21096CDE091D2625A66A0F6DDB7E2F66EA29A8114494C148EF6D04FEC0A97FC9E48373E99F306A3B4C09DAED23C8F2838146B0B7C530D3976014DC13FA73E83FF66FB328004013DBCF8423D14D61C041F1B2A29BA37E05F6425372398605B3EC433A943415E613A3F68CCFBBE7845E968B6F60EC7365C2BE3B081E8B942CF30FEC9B4D79080C40A ss = 62F446D9C938ABACC201AACF02A6718B9F43922516F2AF5B count = 99 seed = 2A6F7386B815366F572AEB6C79E272CC21B7095FE09575F18072C9D677DA23BC9C8A4BC393B7524604D299BEDD260C8B pk = 28AD56DBFA51A96E17D19EA46FF26AA9C94989ECF0D4E364AFA163BE4BC2DF96D4EF0C4ED44BA0AB1F899D2EFDC606535C343D6B9ECBBC8064A2A6CCFC71F37632BA5645BD6A5F3462454A104E18F6095ECCF7F76FB18FF8C0AC96A1A1235CBAFDB617519EEE54E9316EBB071E19428876FE69A0D84414080BDE38A88E4AB61AAADC344DD9859F90EF65F10B10EA1E206664D031031993D2885C86C381E7F219501F08353919D97970254F8E3FCCA41D223A2C53CA34587E844DB73850F3693E69D8780BE4F58A6CF79B70C640484238DF2A0BF9B2198721EB9AFE7789851E6660896E568C06446D2C717304441AB77CD166437D64BAF6C86B3F76DAE4C61B732872E196C4155871BBD1A4CD4B980729C8067211007A501F194A71B086FD72FE3D7535BA299D3246ADBC9DC75B53DD496ED831B7840ED551183FF48A05A7B91C2A6656497954BC4D41C5A56A641F6AA2A92E7AE65FCB38A2AB717B0091E3B76A529E08CA36BAD09543963180CDEF8879BF6DDACAFD617B507EE6C9617D7E9406D85D51137602D83DF65D42284E394C1AE2D57B10969138193D94BD2CDB92762EE4AC4D7B1A5BC3538801B3438D68782C487403650059C968D66A0BBA2EBA85202BC0C729AF04AB0D6368FE1F47D7D70DC57077160D1A9871EE77D1B1A431D0E3875231B9BABED9FB5F7D7B4819FD991535D9512D6B512A0B3044AA42F040FAACED9A583ABE5DFF73DF0BFE46E906FE5598EFFF7E7D1BDACAA54099CD8A98F7D588B91E9A77CC6DEB7C76E998719C1FDD84BC511E sk = 195D6C86A3DF4C21E3007D7F2768B43C74CB3060E0ECA77F0A5D3271542B9A84AE77E0F9F21EABD8C0C6EEA7767F4E10FDE5C2D79B8400BF96B19014B457EC21CB84E70A7F05DEE947808468042CE10228AD56DBFA51A96E17D19EA46FF26AA9C94989ECF0D4E364AFA163BE4BC2DF96D4EF0C4ED44BA0AB1F899D2EFDC606535C343D6B9ECBBC8064A2A6CCFC71F37632BA5645BD6A5F3462454A104E18F6095ECCF7F76FB18FF8C0AC96A1A1235CBAFDB617519EEE54E9316EBB071E19428876FE69A0D84414080BDE38A88E4AB61AAADC344DD9859F90EF65F10B10EA1E206664D031031993D2885C86C381E7F219501F08353919D97970254F8E3FCCA41D223A2C53CA34587E844DB73850F3693E69D8780BE4F58A6CF79B70C640484238DF2A0BF9B2198721EB9AFE7789851E6660896E568C06446D2C717304441AB77CD166437D64BAF6C86B3F76DAE4C61B732872E196C4155871BBD1A4CD4B980729C8067211007A501F194A71B086FD72FE3D7535BA299D3246ADBC9DC75B53DD496ED831B7840ED551183FF48A05A7B91C2A6656497954BC4D41C5A56A641F6AA2A92E7AE65FCB38A2AB717B0091E3B76A529E08CA36BAD09543963180CDEF8879BF6DDACAFD617B507EE6C9617D7E9406D85D51137602D83DF65D42284E394C1AE2D57B10969138193D94BD2CDB92762EE4AC4D7B1A5BC3538801B3438D68782C487403650059C968D66A0BBA2EBA85202BC0C729AF04AB0D6368FE1F47D7D70DC57077160D1A9871EE77D1B1A431D0E3875231B9BABED9FB5F7D7B4819FD991535D9512D6B512A0B3044AA42F040FAACED9A583ABE5DFF73DF0BFE46E906FE5598EFFF7E7D1BDACAA54099CD8A98F7D588B91E9A77CC6DEB7C76E998719C1FDD84BC511E ct = 28C315E99B6BBD17A7B046C104F4A71F6E3AA8E846CB882F4B3693CDB4C1AD816E25C835BA2EDF616A8DF79FF92DF1848A801C2E6D7E89C5FECCF139C83BC80EFF190A880F33160867DFAA3139E46832217009F2BAC4C77578829A39B4275B0A58015588A0B060B38497E27355A6BDF6C8947CD870F0CB4400308113D53B68A925E30EE35D02435C86122F619DDDFA09521A062B3F814DA9057DB9BF19813949503AC7903BAA309D3746693BD05A8EF7044749D773197ECDFC913D1695D28DB87A8B84B816E4DDA864A4D8313089C3964FE02E403CB7AD77BED351CABDADF49289F943647A83ECAAEA36731827429072E44ACF681797B70B0AF34E3EE524915BC569C2961A705EEE389A1A56B4A9C591473E3BABCB3F04368A1B45EEFC12CF62176298DFFF909A64F84B83E072B7FC196C3A3EA389DF223C42334B0B6CE1A9F77629274BC7A34CDD7ADF2E1065C50C087E82B6F12D325F8D1C15017051EA4DD7142C9AC86F2533BB1C60A04CA1FC49AC955205C15690BD049D86BF14FBE1CFF69CC05E45CFDD191160930BA67E33312517603CFFC93B7C801014162F8C3734DBACBB7DEF7E973090DA7E44EBF97D4D44C053E4D0F751934F68748D06C794BC85968A2F1597FD706DA0BF50668E80AAFEB554A0A2083825F7767ADBFE0C0FB33E059B3474E78660BC6FB5B183140EE2CBC6AE574141D9A688C312A8481D7E9261DA933BE5CBBEA0723D3AF18744E3707A950E6EFF0F4DF45AFB5C8ADB34A51F449382FD1C5FD3C9756FD3BC3B9B217903A340E26D9772E02B6EA0DEBB1426C191D70095CAF0B032BC69B217661975F83A3C4C0648 ss = 55A74BFC29EB82D301F428A0B1AF156BFC730F15CE4CA371 golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/internal/000077500000000000000000000000001343600534300234415ustar00rootroot00000000000000golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/internal/arith/000077500000000000000000000000001343600534300245505ustar00rootroot00000000000000golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/internal/arith/generic.go000066400000000000000000000026001343600534300265110ustar00rootroot00000000000000// +build noasm !amd64 package internal // helper used for Uint128 representation type Uint128 struct { H, L uint64 } // Adds 2 64bit digits in constant time. // Returns result and carry (1 or 0) func Addc64(cin, a, b uint64) (ret, cout uint64) { t := a + cin ret = b + t cout = ((a & b) | ((a | b) & (^ret))) >> 63 return } // Substracts 2 64bit digits in constant time. // Returns result and borrow (1 or 0) func Subc64(bIn, a, b uint64) (ret, bOut uint64) { var tmp1 = a - b // Set bOut if bIn!=0 and tmp1==0 in constant time bOut = bIn & (1 ^ ((tmp1 | uint64(0-tmp1)) >> 63)) // Constant time check if x> 63 ret = tmp1 - bIn return } // Multiplies 2 64bit digits in constant time func Mul64(a, b uint64) (res Uint128) { var al, bl, ah, bh, albl, albh, ahbl, ahbh uint64 var res1, res2, res3 uint64 var carry, maskL, maskH, temp uint64 maskL = (^maskL) >> 32 maskH = ^maskL al = a & maskL ah = a >> 32 bl = b & maskL bh = b >> 32 albl = al * bl albh = al * bh ahbl = ah * bl ahbh = ah * bh res.L = albl & maskL res1 = albl >> 32 res2 = ahbl & maskL res3 = albh & maskL temp = res1 + res2 + res3 carry = temp >> 32 res.L ^= temp << 32 res1 = ahbl >> 32 res2 = albh >> 32 res3 = ahbh & maskL temp = res1 + res2 + res3 + carry res.H = temp & maskL carry = temp & maskH res.H ^= (ahbh & maskH) + carry return } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/internal/isogeny/000077500000000000000000000000001343600534300251165ustar00rootroot00000000000000golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/internal/isogeny/curve_ops.go000066400000000000000000000360661343600534300274650ustar00rootroot00000000000000package internal type CurveOperations struct { Params *SidhParams } // Computes j-invariant for a curve y2=x3+A/Cx+x with A,C in F_(p^2). Result // is returned in jBytes buffer, encoded in little-endian format. Caller // provided jBytes buffer has to be big enough to j-invariant value. In case // of SIDH, buffer size must be at least size of shared secret. // Implementation corresponds to Algorithm 9 from SIKE. func (c *CurveOperations) Jinvariant(cparams *ProjectiveCurveParameters, jBytes []byte) { var j, t0, t1 Fp2Element op := c.Params.Op op.Square(&j, &cparams.A) // j = A^2 op.Square(&t1, &cparams.C) // t1 = C^2 op.Add(&t0, &t1, &t1) // t0 = t1 + t1 op.Sub(&t0, &j, &t0) // t0 = j - t0 op.Sub(&t0, &t0, &t1) // t0 = t0 - t1 op.Sub(&j, &t0, &t1) // t0 = t0 - t1 op.Square(&t1, &t1) // t1 = t1^2 op.Mul(&j, &j, &t1) // j = j * t1 op.Add(&t0, &t0, &t0) // t0 = t0 + t0 op.Add(&t0, &t0, &t0) // t0 = t0 + t0 op.Square(&t1, &t0) // t1 = t0^2 op.Mul(&t0, &t0, &t1) // t0 = t0 * t1 op.Add(&t0, &t0, &t0) // t0 = t0 + t0 op.Add(&t0, &t0, &t0) // t0 = t0 + t0 op.Inv(&j, &j) // j = 1/j op.Mul(&j, &t0, &j) // j = t0 * j c.Fp2ToBytes(jBytes, &j) } // Given affine points x(P), x(Q) and x(Q-P) in a extension field F_{p^2}, function // recorvers projective coordinate A of a curve. This is Algorithm 10 from SIKE. func (c *CurveOperations) RecoverCoordinateA(curve *ProjectiveCurveParameters, xp, xq, xr *Fp2Element) { var t0, t1 Fp2Element op := c.Params.Op op.Add(&t1, xp, xq) // t1 = Xp + Xq op.Mul(&t0, xp, xq) // t0 = Xp * Xq op.Mul(&curve.A, xr, &t1) // A = X(q-p) * t1 op.Add(&curve.A, &curve.A, &t0) // A = A + t0 op.Mul(&t0, &t0, xr) // t0 = t0 * X(q-p) op.Sub(&curve.A, &curve.A, &c.Params.OneFp2) // A = A - 1 op.Add(&t0, &t0, &t0) // t0 = t0 + t0 op.Add(&t1, &t1, xr) // t1 = t1 + X(q-p) op.Add(&t0, &t0, &t0) // t0 = t0 + t0 op.Square(&curve.A, &curve.A) // A = A^2 op.Inv(&t0, &t0) // t0 = 1/t0 op.Mul(&curve.A, &curve.A, &t0) // A = A * t0 op.Sub(&curve.A, &curve.A, &t1) // A = A - t1 } // Computes equivalence (A:C) ~ (A+2C : A-2C) func (c *CurveOperations) CalcCurveParamsEquiv3(cparams *ProjectiveCurveParameters) CurveCoefficientsEquiv { var coef CurveCoefficientsEquiv var c2 Fp2Element var op = c.Params.Op op.Add(&c2, &cparams.C, &cparams.C) // A24p = A+2*C op.Add(&coef.A, &cparams.A, &c2) // A24m = A-2*C op.Sub(&coef.C, &cparams.A, &c2) return coef } // Computes equivalence (A:C) ~ (A+2C : 4C) func (c *CurveOperations) CalcCurveParamsEquiv4(cparams *ProjectiveCurveParameters) CurveCoefficientsEquiv { var coefEq CurveCoefficientsEquiv var op = c.Params.Op op.Add(&coefEq.C, &cparams.C, &cparams.C) // A24p = A+2C op.Add(&coefEq.A, &cparams.A, &coefEq.C) // C24 = 4*C op.Add(&coefEq.C, &coefEq.C, &coefEq.C) return coefEq } // Helper function for RightToLeftLadder(). Returns A+2C / 4. func (c *CurveOperations) CalcAplus2Over4(cparams *ProjectiveCurveParameters) (ret Fp2Element) { var tmp Fp2Element var op = c.Params.Op // 2C op.Add(&tmp, &cparams.C, &cparams.C) // A+2C op.Add(&ret, &cparams.A, &tmp) // 1/4C op.Add(&tmp, &tmp, &tmp) op.Inv(&tmp, &tmp) // A+2C/4C op.Mul(&ret, &ret, &tmp) return } // Recovers (A:C) curve parameters from projectively equivalent (A+2C:A-2C). func (c *CurveOperations) RecoverCurveCoefficients3(cparams *ProjectiveCurveParameters, coefEq *CurveCoefficientsEquiv) { var op = c.Params.Op op.Add(&cparams.A, &coefEq.A, &coefEq.C) // cparams.A = 2*(A+2C+A-2C) = 4A op.Add(&cparams.A, &cparams.A, &cparams.A) // cparams.C = (A+2C-A+2C) = 4C op.Sub(&cparams.C, &coefEq.A, &coefEq.C) return } // Recovers (A:C) curve parameters from projectively equivalent (A+2C:4C). func (c *CurveOperations) RecoverCurveCoefficients4(cparams *ProjectiveCurveParameters, coefEq *CurveCoefficientsEquiv) { var op = c.Params.Op // cparams.C = (4C)*1/2=2C op.Mul(&cparams.C, &coefEq.C, &c.Params.HalfFp2) // cparams.A = A+2C - 2C = A op.Sub(&cparams.A, &coefEq.A, &cparams.C) // cparams.C = 2C * 1/2 = C op.Mul(&cparams.C, &cparams.C, &c.Params.HalfFp2) return } // Combined coordinate doubling and differential addition. Takes projective points // P,Q,Q-P and (A+2C)/4C curve E coefficient. Returns 2*P and P+Q calculated on E. // Function is used only by RightToLeftLadder. Corresponds to Algorithm 5 of SIKE func (c *CurveOperations) xDblAdd(P, Q, QmP *ProjectivePoint, a24 *Fp2Element) (dblP, PaQ ProjectivePoint) { var t0, t1, t2 Fp2Element var op = c.Params.Op xQmP, zQmP := &QmP.X, &QmP.Z xPaQ, zPaQ := &PaQ.X, &PaQ.Z x2P, z2P := &dblP.X, &dblP.Z xP, zP := &P.X, &P.Z xQ, zQ := &Q.X, &Q.Z op.Add(&t0, xP, zP) // t0 = Xp+Zp op.Sub(&t1, xP, zP) // t1 = Xp-Zp op.Square(x2P, &t0) // 2P.X = t0^2 op.Sub(&t2, xQ, zQ) // t2 = Xq-Zq op.Add(xPaQ, xQ, zQ) // Xp+q = Xq+Zq op.Mul(&t0, &t0, &t2) // t0 = t0 * t2 op.Mul(z2P, &t1, &t1) // 2P.Z = t1 * t1 op.Mul(&t1, &t1, xPaQ) // t1 = t1 * Xp+q op.Sub(&t2, x2P, z2P) // t2 = 2P.X - 2P.Z op.Mul(x2P, x2P, z2P) // 2P.X = 2P.X * 2P.Z op.Mul(xPaQ, a24, &t2) // Xp+q = A24 * t2 op.Sub(zPaQ, &t0, &t1) // Zp+q = t0 - t1 op.Add(z2P, xPaQ, z2P) // 2P.Z = Xp+q + 2P.Z op.Add(xPaQ, &t0, &t1) // Xp+q = t0 + t1 op.Mul(z2P, z2P, &t2) // 2P.Z = 2P.Z * t2 op.Square(zPaQ, zPaQ) // Zp+q = Zp+q ^ 2 op.Square(xPaQ, xPaQ) // Xp+q = Xp+q ^ 2 op.Mul(zPaQ, xQmP, zPaQ) // Zp+q = Xq-p * Zp+q op.Mul(xPaQ, zQmP, xPaQ) // Xp+q = Zq-p * Xp+q return } // Given the curve parameters, xP = x(P), computes xP = x([2^k]P) // Safe to overlap xP, x2P. func (c *CurveOperations) Pow2k(xP *ProjectivePoint, params *CurveCoefficientsEquiv, k uint32) { var t0, t1 Fp2Element var op = c.Params.Op x, z := &xP.X, &xP.Z for i := uint32(0); i < k; i++ { op.Sub(&t0, x, z) // t0 = Xp - Zp op.Add(&t1, x, z) // t1 = Xp + Zp op.Square(&t0, &t0) // t0 = t0 ^ 2 op.Square(&t1, &t1) // t1 = t1 ^ 2 op.Mul(z, ¶ms.C, &t0) // Z2p = C24 * t0 op.Mul(x, z, &t1) // X2p = Z2p * t1 op.Sub(&t1, &t1, &t0) // t1 = t1 - t0 op.Mul(&t0, ¶ms.A, &t1) // t0 = A24+ * t1 op.Add(z, z, &t0) // Z2p = Z2p + t0 op.Mul(z, z, &t1) // Zp = Z2p * t1 } } // Given the curve parameters, xP = x(P), and k >= 0, compute xP = x([3^k]P). // // Safe to overlap xP, xR. func (c *CurveOperations) Pow3k(xP *ProjectivePoint, params *CurveCoefficientsEquiv, k uint32) { var t0, t1, t2, t3, t4, t5, t6 Fp2Element var op = c.Params.Op x, z := &xP.X, &xP.Z for i := uint32(0); i < k; i++ { op.Sub(&t0, x, z) // t0 = Xp - Zp op.Square(&t2, &t0) // t2 = t0^2 op.Add(&t1, x, z) // t1 = Xp + Zp op.Square(&t3, &t1) // t3 = t1^2 op.Add(&t4, &t1, &t0) // t4 = t1 + t0 op.Sub(&t0, &t1, &t0) // t0 = t1 - t0 op.Square(&t1, &t4) // t1 = t4^2 op.Sub(&t1, &t1, &t3) // t1 = t1 - t3 op.Sub(&t1, &t1, &t2) // t1 = t1 - t2 op.Mul(&t5, &t3, ¶ms.A) // t5 = t3 * A24+ op.Mul(&t3, &t3, &t5) // t3 = t5 * t3 op.Mul(&t6, &t2, ¶ms.C) // t6 = t2 * A24- op.Mul(&t2, &t2, &t6) // t2 = t2 * t6 op.Sub(&t3, &t2, &t3) // t3 = t2 - t3 op.Sub(&t2, &t5, &t6) // t2 = t5 - t6 op.Mul(&t1, &t2, &t1) // t1 = t2 * t1 op.Add(&t2, &t3, &t1) // t2 = t3 + t1 op.Square(&t2, &t2) // t2 = t2^2 op.Mul(x, &t2, &t4) // X3p = t2 * t4 op.Sub(&t1, &t3, &t1) // t1 = t3 - t1 op.Square(&t1, &t1) // t1 = t1^2 op.Mul(z, &t1, &t0) // Z3p = t1 * t0 } } // Set (y1, y2, y3) = (1/x1, 1/x2, 1/x3). // // All xi, yi must be distinct. func (c *CurveOperations) Fp2Batch3Inv(x1, x2, x3, y1, y2, y3 *Fp2Element) { var x1x2, t Fp2Element var op = c.Params.Op op.Mul(&x1x2, x1, x2) // x1*x2 op.Mul(&t, &x1x2, x3) // 1/(x1*x2*x3) op.Inv(&t, &t) op.Mul(y1, &t, x2) // 1/x1 op.Mul(y1, y1, x3) op.Mul(y2, &t, x1) // 1/x2 op.Mul(y2, y2, x3) op.Mul(y3, &t, &x1x2) // 1/x3 } // ScalarMul3Pt is a right-to-left point multiplication that given the // x-coordinate of P, Q and P-Q calculates the x-coordinate of R=Q+[scalar]P. // nbits must be smaller or equal to len(scalar). func (c *CurveOperations) ScalarMul3Pt(cparams *ProjectiveCurveParameters, P, Q, PmQ *ProjectivePoint, nbits uint, scalar []uint8) ProjectivePoint { var R0, R2, R1 ProjectivePoint var op = c.Params.Op aPlus2Over4 := c.CalcAplus2Over4(cparams) R1 = *P R2 = *PmQ R0 = *Q // Iterate over the bits of the scalar, bottom to top prevBit := uint8(0) for i := uint(0); i < nbits; i++ { bit := (scalar[i>>3] >> (i & 7) & 1) swap := prevBit ^ bit prevBit = bit op.CondSwap(&R1.X, &R1.Z, &R2.X, &R2.Z, swap) R0, R2 = c.xDblAdd(&R0, &R2, &R1, &aPlus2Over4) } op.CondSwap(&R1.X, &R1.Z, &R2.X, &R2.Z, prevBit) return R1 } // Convert the input to wire format. // // The output byte slice must be at least 2*bytelen(p) bytes long. func (c *CurveOperations) Fp2ToBytes(output []byte, fp2 *Fp2Element) { if len(output) < 2*c.Params.Bytelen { panic("output byte slice too short") } var a Fp2Element c.Params.Op.FromMontgomery(fp2, &a) // convert to bytes in little endian form for i := 0; i < c.Params.Bytelen; i++ { // set i = j*8 + k tmp := i / 8 k := uint64(i % 8) output[i] = byte(a.A[tmp] >> (8 * k)) output[i+c.Params.Bytelen] = byte(a.B[tmp] >> (8 * k)) } } // Read 2*bytelen(p) bytes into the given ExtensionFieldElement. // // It is an error to call this function if the input byte slice is less than 2*bytelen(p) bytes long. func (c *CurveOperations) Fp2FromBytes(fp2 *Fp2Element, input []byte) { if len(input) < 2*c.Params.Bytelen { panic("input byte slice too short") } for i := 0; i < c.Params.Bytelen; i++ { j := i / 8 k := uint64(i % 8) fp2.A[j] |= uint64(input[i]) << (8 * k) fp2.B[j] |= uint64(input[i+c.Params.Bytelen]) << (8 * k) } c.Params.Op.ToMontgomery(fp2) } /* ------------------------------------------------------------------------- Mechnisms used for isogeny calculations -------------------------------------------------------------------------*/ // Constructs isogeny3 objects func Newisogeny3(op FieldOps) Isogeny { return &isogeny3{Field: op} } // Constructs isogeny4 objects func Newisogeny4(op FieldOps) Isogeny { return &isogeny4{isogeny3: isogeny3{Field: op}} } // Given a three-torsion point p = x(PB) on the curve E_(A:C), construct the // three-isogeny phi : E_(A:C) -> E_(A:C)/ = E_(A':C'). // // Input: (XP_3: ZP_3), where P_3 has exact order 3 on E_A/C // Output: * Curve coordinates (A' + 2C', A' - 2C') corresponding to E_A'/C' = A_E/C/ // * Isogeny phi with constants in F_p^2 func (phi *isogeny3) GenerateCurve(p *ProjectivePoint) CurveCoefficientsEquiv { var t0, t1, t2, t3, t4 Fp2Element var coefEq CurveCoefficientsEquiv var K1, K2 = &phi.K1, &phi.K2 op := phi.Field op.Sub(K1, &p.X, &p.Z) // K1 = XP3 - ZP3 op.Square(&t0, K1) // t0 = K1^2 op.Add(K2, &p.X, &p.Z) // K2 = XP3 + ZP3 op.Square(&t1, K2) // t1 = K2^2 op.Add(&t2, &t0, &t1) // t2 = t0 + t1 op.Add(&t3, K1, K2) // t3 = K1 + K2 op.Square(&t3, &t3) // t3 = t3^2 op.Sub(&t3, &t3, &t2) // t3 = t3 - t2 op.Add(&t2, &t1, &t3) // t2 = t1 + t3 op.Add(&t3, &t3, &t0) // t3 = t3 + t0 op.Add(&t4, &t3, &t0) // t4 = t3 + t0 op.Add(&t4, &t4, &t4) // t4 = t4 + t4 op.Add(&t4, &t1, &t4) // t4 = t1 + t4 op.Mul(&coefEq.C, &t2, &t4) // A24m = t2 * t4 op.Add(&t4, &t1, &t2) // t4 = t1 + t2 op.Add(&t4, &t4, &t4) // t4 = t4 + t4 op.Add(&t4, &t0, &t4) // t4 = t0 + t4 op.Mul(&t4, &t3, &t4) // t4 = t3 * t4 op.Sub(&t0, &t4, &coefEq.C) // t0 = t4 - A24m op.Add(&coefEq.A, &coefEq.C, &t0) // A24p = A24m + t0 return coefEq } // Given a 3-isogeny phi and a point pB = x(PB), compute x(QB), the x-coordinate // of the image QB = phi(PB) of PB under phi : E_(A:C) -> E_(A':C'). // // The output xQ = x(Q) is then a point on the curve E_(A':C'); the curve // parameters are returned by the GenerateCurve function used to construct phi. func (phi *isogeny3) EvaluatePoint(p *ProjectivePoint) ProjectivePoint { var t0, t1, t2 Fp2Element var q ProjectivePoint var K1, K2 = &phi.K1, &phi.K2 var px, pz = &p.X, &p.Z op := phi.Field op.Add(&t0, px, pz) // t0 = XQ + ZQ op.Sub(&t1, px, pz) // t1 = XQ - ZQ op.Mul(&t0, K1, &t0) // t2 = K1 * t0 op.Mul(&t1, K2, &t1) // t1 = K2 * t1 op.Add(&t2, &t0, &t1) // t2 = t0 + t1 op.Sub(&t0, &t1, &t0) // t0 = t1 - t0 op.Square(&t2, &t2) // t2 = t2 ^ 2 op.Square(&t0, &t0) // t0 = t0 ^ 2 op.Mul(&q.X, px, &t2) // XQ'= XQ * t2 op.Mul(&q.Z, pz, &t0) // ZQ'= ZQ * t0 return q } // Given a four-torsion point p = x(PB) on the curve E_(A:C), construct the // four-isogeny phi : E_(A:C) -> E_(A:C)/ = E_(A':C'). // // Input: (XP_4: ZP_4), where P_4 has exact order 4 on E_A/C // Output: * Curve coordinates (A' + 2C', 4C') corresponding to E_A'/C' = A_E/C/ // * Isogeny phi with constants in F_p^2 func (phi *isogeny4) GenerateCurve(p *ProjectivePoint) CurveCoefficientsEquiv { var coefEq CurveCoefficientsEquiv var xp4, zp4 = &p.X, &p.Z var K1, K2, K3 = &phi.K1, &phi.K2, &phi.K3 op := phi.Field op.Sub(K2, xp4, zp4) op.Add(K3, xp4, zp4) op.Square(K1, zp4) op.Add(K1, K1, K1) op.Square(&coefEq.C, K1) op.Add(K1, K1, K1) op.Square(&coefEq.A, xp4) op.Add(&coefEq.A, &coefEq.A, &coefEq.A) op.Square(&coefEq.A, &coefEq.A) return coefEq } // Given a 4-isogeny phi and a point xP = x(P), compute x(Q), the x-coordinate // of the image Q = phi(P) of P under phi : E_(A:C) -> E_(A':C'). // // Input: Isogeny returned by GenerateCurve and point q=(Qx,Qz) from E0_A/C // Output: Corresponding point q from E1_A'/C', where E1 is 4-isogenous to E0 func (phi *isogeny4) EvaluatePoint(p *ProjectivePoint) ProjectivePoint { var t0, t1 Fp2Element var q = *p var xq, zq = &q.X, &q.Z var K1, K2, K3 = &phi.K1, &phi.K2, &phi.K3 op := phi.Field op.Add(&t0, xq, zq) op.Sub(&t1, xq, zq) op.Mul(xq, &t0, K2) op.Mul(zq, &t1, K3) op.Mul(&t0, &t0, &t1) op.Mul(&t0, &t0, K1) op.Add(&t1, xq, zq) op.Sub(zq, xq, zq) op.Square(&t1, &t1) op.Square(zq, zq) op.Add(xq, &t0, &t1) op.Sub(&t0, zq, &t0) op.Mul(xq, xq, &t1) op.Mul(zq, zq, &t0) return q } /* ------------------------------------------------------------------------- Utils -------------------------------------------------------------------------*/ func (point *ProjectivePoint) ToAffine(c *CurveOperations) *Fp2Element { var affine_x Fp2Element c.Params.Op.Inv(&affine_x, &point.Z) c.Params.Op.Mul(&affine_x, &affine_x, &point.X) return &affine_x } // Cleans data in fp func (fp *Fp2Element) Zeroize() { // Zeroizing in 2 seperated loops tells compiler to // use fast runtime.memclr() for i := range fp.A { fp.A[i] = 0 } for i := range fp.B { fp.B[i] = 0 } } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/internal/isogeny/types.go000066400000000000000000000076311343600534300266200ustar00rootroot00000000000000package internal const ( FP_MAX_WORDS = 12 // Currently p751.NumWords ) // Representation of an element of the base field F_p. // // No particular meaning is assigned to the representation -- it could represent // an element in Montgomery form, or not. Tracking the meaning of the field // element is left to higher types. type FpElement [FP_MAX_WORDS]uint64 // Represents an intermediate product of two elements of the base field F_p. type FpElementX2 [2 * FP_MAX_WORDS]uint64 // Represents an element of the extended field Fp^2 = Fp(x+i) type Fp2Element struct { A FpElement B FpElement } type DomainParams struct { // P, Q and R=P-Q base points Affine_P, Affine_Q, Affine_R Fp2Element // Size of a compuatation strategy for x-torsion group IsogenyStrategy []uint32 // Max size of secret key for x-torsion group SecretBitLen uint // Max size of secret key for x-torsion group SecretByteLen uint } type SidhParams struct { Id uint8 // Bytelen of P Bytelen int // The public key size, in bytes. PublicKeySize int // The shared secret size, in bytes. SharedSecretSize int // 2- and 3-torsion group parameter definitions A, B DomainParams // Precomputed identity element in the Fp2 in Montgomery domain OneFp2 Fp2Element // Precomputed 1/2 in the Fp2 in Montgomery domain HalfFp2 Fp2Element // Length of SIKE secret message. Must be one of {24,32,40}, // depending on size of prime field used (see [SIKE], 1.4 and 5.1) MsgLen int // Length of SIKE ephemeral KEM key (see [SIKE], 1.4 and 5.1) KemSize int // Access to field arithmetic Op FieldOps } // Interface for working with isogenies. type Isogeny interface { // Given a torsion point on a curve computes isogenous curve. // Returns curve coefficients (A:C), so that E_(A/C) = E_(A/C)/

, // where P is a provided projective point. Sets also isogeny constants // that are needed for isogeny evaluation. GenerateCurve(*ProjectivePoint) CurveCoefficientsEquiv // Evaluates isogeny at caller provided point. Requires isogeny curve constants // to be earlier computed by GenerateCurve. EvaluatePoint(*ProjectivePoint) ProjectivePoint } // Stores curve projective parameters equivalent to A/C. Meaning of the // values depends on the context. When working with isogenies over // subgroup that are powers of: // * three then (A:C) ~ (A+2C:A-2C) // * four then (A:C) ~ (A+2C: 4C) // See Appendix A of SIKE for more details type CurveCoefficientsEquiv struct { A Fp2Element C Fp2Element } // A point on the projective line P^1(F_{p^2}). // // This represents a point on the Kummer line of a Montgomery curve. The // curve is specified by a ProjectiveCurveParameters struct. type ProjectivePoint struct { X Fp2Element Z Fp2Element } // A point on the projective line P^1(F_{p^2}). // // This is used to work projectively with the curve coefficients. type ProjectiveCurveParameters struct { A Fp2Element C Fp2Element } // Stores Isogeny 3 curve constants type isogeny3 struct { Field FieldOps K1 Fp2Element K2 Fp2Element } // Stores Isogeny 4 curve constants type isogeny4 struct { isogeny3 K3 Fp2Element } type FieldOps interface { // Set res = lhs + rhs. // // Allowed to overlap lhs or rhs with res. Add(res, lhs, rhs *Fp2Element) // Set res = lhs - rhs. // // Allowed to overlap lhs or rhs with res. Sub(res, lhs, rhs *Fp2Element) // Set res = lhs * rhs. // // Allowed to overlap lhs or rhs with res. Mul(res, lhs, rhs *Fp2Element) // Set res = x * x // // Allowed to overlap res with x. Square(res, x *Fp2Element) // Set res = 1/x // // Allowed to overlap res with x. Inv(res, x *Fp2Element) // If choice = 1u8, set (x,y) = (y,x). If choice = 0u8, set (x,y) = (x,y). CondSwap(xPx, xPz, xQx, xQz *Fp2Element, choice uint8) // Converts Fp2Element to Montgomery domain (x*R mod p) ToMontgomery(x *Fp2Element) // Converts 'a' in montgomery domain to element from Fp2Element // and stores it in 'x' FromMontgomery(x *Fp2Element, a *Fp2Element) } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/internal/utils/000077500000000000000000000000001343600534300246015ustar00rootroot00000000000000golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/internal/utils/cpu.go000066400000000000000000000002261343600534300257170ustar00rootroot00000000000000package utils type x86 struct { // Signals support for MULX which is in BMI2 HasBMI2 bool // Signals support for ADX HasADX bool } var X86 x86 golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/internal/utils/cpuid_amd64.go000066400000000000000000000015031343600534300272260ustar00rootroot00000000000000// +build amd64,!noasm // Sets capabilities flags for x86 according to information received from // CPUID. It was written in accordance with // "Intel® 64 and IA-32 Architectures Developer's Manual: Vol. 2A". // https://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-2a-manual.html package utils // Performs CPUID and returns values of registers // go:nosplit func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) // Returns true in case bit 'n' in 'bits' is set, otherwise false func bitn(bits uint32, n uint8) bool { return (bits>>n)&1 == 1 } func init() { // CPUID returns max possible input that can be requested max, _, _, _ := cpuid(0, 0) if max < 7 { return } _, ebx, _, _ := cpuid(7, 0) X86.HasBMI2 = bitn(ebx, 8) X86.HasADX = bitn(ebx, 19) } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/internal/utils/cpuid_amd64.s000066400000000000000000000003641343600534300270670ustar00rootroot00000000000000// +build amd64,!noasm #include "textflag.h" TEXT ·cpuid(SB), NOSPLIT, $0-4 MOVL eaxArg+0(FP), AX MOVL ecxArg+4(FP), CX CPUID MOVL AX, eax+8(FP) MOVL BX, ebx+12(FP) MOVL CX, ecx+16(FP) MOVL DX, edx+20(FP) RET golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p503/000077500000000000000000000000001343600534300223145ustar00rootroot00000000000000golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p503/arith_amd64.s000066400000000000000000001161401343600534300246050ustar00rootroot00000000000000// +build amd64,!noasm #include "textflag.h" // p503 #define P503_0 $0xFFFFFFFFFFFFFFFF #define P503_1 $0xFFFFFFFFFFFFFFFF #define P503_2 $0xFFFFFFFFFFFFFFFF #define P503_3 $0xABFFFFFFFFFFFFFF #define P503_4 $0x13085BDA2211E7A0 #define P503_5 $0x1B9BF6C87B7E7DAF #define P503_6 $0x6045C6BDDA77A4D0 #define P503_7 $0x004066F541811E1E // p503+1 #define P503P1_3 $0xAC00000000000000 #define P503P1_4 $0x13085BDA2211E7A0 #define P503P1_5 $0x1B9BF6C87B7E7DAF #define P503P1_6 $0x6045C6BDDA77A4D0 #define P503P1_7 $0x004066F541811E1E // p503x2 #define P503X2_0 $0xFFFFFFFFFFFFFFFE #define P503X2_1 $0xFFFFFFFFFFFFFFFF #define P503X2_2 $0xFFFFFFFFFFFFFFFF #define P503X2_3 $0x57FFFFFFFFFFFFFF #define P503X2_4 $0x2610B7B44423CF41 #define P503X2_5 $0x3737ED90F6FCFB5E #define P503X2_6 $0xC08B8D7BB4EF49A0 #define P503X2_7 $0x0080CDEA83023C3C #define REG_P1 DI #define REG_P2 SI #define REG_P3 DX // Performs schoolbook multiplication of 2 256-bit numbers. This optimized version // uses MULX instruction. Macro smashes value in DX. // Input: I0 and I1. // Output: O // All the other arguments are resgisters, used for storing temporary values #define MULS256_MULX(O, I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ MOVQ I0, DX \ MULXQ I1, T1, T0 \ // T0:T1 = A0*B0 MOVQ T1, O \ // O[0] MULXQ 8+I1, T2, T1 \ // T1:T2 = U0*V1 ADDQ T2, T0 \ MULXQ 16+I1, T3, T2 \ // T2:T3 = U0*V2 ADCQ T3, T1 \ MULXQ 24+I1, T4, T3 \ // T3:T4 = U0*V3 ADCQ T4, T2 \ \ // Column U1 MOVQ 8+I0, DX \ ADCQ $0, T3 \ MULXQ 0+I1, T4, T5 \ // T5:T4 = U1*V0 MULXQ 8+I1, T7, T6 \ // T6:T7 = U1*V1 ADDQ T7, T5 \ MULXQ 16+I1, T8, T7 \ // T7:T8 = U1*V2 ADCQ T8, T6 \ MULXQ 24+I1, T9, T8 \ // T8:T9 = U1*V3 ADCQ T9, T7 \ ADCQ $0, T8 \ ADDQ T0, T4 \ MOVQ T4, 8+O \ // O[1] ADCQ T1, T5 \ ADCQ T2, T6 \ ADCQ T3, T7 \ \ // Column U2 MOVQ 16+I0, DX \ ADCQ $0, T8 \ MULXQ 0+I1, T0, T1 \ // T1:T0 = U2*V0 MULXQ 8+I1, T3, T2 \ // T2:T3 = U2*V1 ADDQ T3, T1 \ MULXQ 16+I1, T4, T3 \ // T3:T4 = U2*V2 ADCQ T4, T2 \ MULXQ 24+I1, T9, T4 \ // T4:T9 = U2*V3 ADCQ T9, T3 \ \ // Column U3 MOVQ 24+I0, DX \ ADCQ $0, T4 \ ADDQ T5, T0 \ MOVQ T0, 16+O \ // O[2] ADCQ T6, T1 \ ADCQ T7, T2 \ ADCQ T8, T3 \ ADCQ $0, T4 \ MULXQ 0+I1, T0, T5 \ // T5:T0 = U3*V0 MULXQ 8+I1, T7, T6 \ // T6:T7 = U3*V1 ADDQ T7, T5 \ MULXQ 16+I1, T8, T7 \ // T7:T8 = U3*V2 ADCQ T8, T6 \ MULXQ 24+I1, T9, T8 \ // T8:T9 = U3*V3 ADCQ T9, T7 \ ADCQ $0, T8 \ \ // Add values in remaining columns ADDQ T0, T1 \ MOVQ T1, 24+O \ // O[3] ADCQ T5, T2 \ MOVQ T2, 32+O \ // O[4] ADCQ T6, T3 \ MOVQ T3, 40+O \ // O[5] ADCQ T7, T4 \ MOVQ T4, 48+O \ // O[6] ADCQ $0, T8 \ // O[7] MOVQ T8, 56+O // Performs schoolbook multiplication of 2 256-bit numbers. This optimized version // uses ADOX, ADCX and MULX instructions. Macro smashes values in AX and DX. // Input: I0 and I1. // Output: O // All the other arguments resgisters are used for storing temporary values #define MULS256_MULX_ADCX_ADOX(O, I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ \ // U0[0] MOVQ 0+I0, DX \ // MULX requires multiplayer in DX \ // T0:T1 = I1*DX MULXQ I1, T1, T0 \ // T0:T1 = U0*V0 (low:high) MOVQ T1, O \ // O0[0] MULXQ 8+I1, T2, T1 \ // T2:T1 = U0*V1 XORQ AX, AX \ ADOXQ T2, T0 \ MULXQ 16+I1, T3, T2 \ // T2:T3 = U0*V2 ADOXQ T3, T1 \ MULXQ 24+I1, T4, T3 \ // T3:T4 = U0*V3 ADOXQ T4, T2 \ \ // Column U1 MOVQ 8+I0, DX \ MULXQ I1, T4, T5 \ // T5:T4 = U1*V0 ADOXQ AX, T3 \ XORQ AX, AX \ MULXQ 8+I1, T7, T6 \ // T6:T7 = U1*V1 ADOXQ T0, T4 \ MOVQ T4, 8+O \ // O[1] ADCXQ T7, T5 \ MULXQ 16+I1, T8, T7 \ // T7:T8 = U1*V2 ADCXQ T8, T6 \ ADOXQ T1, T5 \ MULXQ 24+I1, T9, T8 \ // T8:T9 = U1*V3 ADCXQ T9, T7 \ ADCXQ AX, T8 \ ADOXQ T2, T6 \ \ // Column U2 MOVQ 16+I0, DX \ MULXQ I1, T0, T1 \ // T1:T0 = U2*V0 ADOXQ T3, T7 \ ADOXQ AX, T8 \ XORQ AX, AX \ MULXQ 8+I1, T3, T2 \ // T2:T3 = U2*V1 ADOXQ T5, T0 \ MOVQ T0, 16+O \ // O[2] ADCXQ T3, T1 \ MULXQ 16+I1, T4, T3 \ // T3:T4 = U2*V2 ADCXQ T4, T2 \ ADOXQ T6, T1 \ MULXQ 24+I1, T9, T4 \ // T9:T4 = U2*V3 ADCXQ T9, T3 \ MOVQ 24+I0, DX \ ADCXQ AX, T4 \ \ ADOXQ T7, T2 \ ADOXQ T8, T3 \ ADOXQ AX, T4 \ \ // Column U3 MULXQ I1, T0, T5 \ // T5:T0 = U3*B0 XORQ AX, AX \ MULXQ 8+I1, T7, T6 \ // T6:T7 = U3*B1 ADCXQ T7, T5 \ ADOXQ T0, T1 \ MULXQ 16+I1, T8, T7 \ // T7:T8 = U3*V2 ADCXQ T8, T6 \ ADOXQ T5, T2 \ MULXQ 24+I1, T9, T8 \ // T8:T9 = U3*V3 ADCXQ T9, T7 \ ADCXQ AX, T8 \ \ ADOXQ T6, T3 \ ADOXQ T7, T4 \ ADOXQ AX, T8 \ MOVQ T1, 24+O \ // O[3] MOVQ T2, 32+O \ // O[4] MOVQ T3, 40+O \ // O[5] MOVQ T4, 48+O \ // O[6] and O[7] below MOVQ T8, 56+O // Template of a macro that performs schoolbook multiplication of 128-bit with 320-bit // number. It uses MULX instruction This template must be customized with functions // performing ADD (add1, add2) and ADD-with-carry (adc1, adc2). addX/adcX may or may // not be instructions that use two independent carry chains. // Input: // * I0 128-bit number // * I1 320-bit number // * add1, add2: instruction performing integer addition and starting carry chain // * adc1, adc2: instruction performing integer addition with carry // Output: T[0-6] registers #define MULS_128x320(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, add1, add2, adc1, adc2) \ \ // Column 0 MOVQ I0, DX \ MULXQ I1+24(SB), T0, T1 \ MULXQ I1+32(SB), T4, T2 \ XORQ AX, AX \ MULXQ I1+40(SB), T5, T3 \ add1 T4, T1 \ adc1 T5, T2 \ MULXQ I1+48(SB), T7, T4 \ adc1 T7, T3 \ MULXQ I1+56(SB), T6, T5 \ adc1 T6, T4 \ adc1 AX, T5 \ \ // Column 1 MOVQ 8+I0, DX \ MULXQ I1+24(SB), T6, T7 \ add2 T6, T1 \ adc2 T7, T2 \ MULXQ I1+32(SB), T8, T6 \ adc2 T6, T3 \ MULXQ I1+40(SB), T7, T9 \ adc2 T9, T4 \ MULXQ I1+48(SB), T9, T6 \ adc2 T6, T5 \ MULXQ I1+56(SB), DX, T6 \ adc2 AX, T6 \ \ // Output XORQ AX, AX \ add1 T8, T2 \ adc1 T7, T3 \ adc1 T9, T4 \ adc1 DX, T5 \ adc1 AX, T6 // Multiplies 128-bit with 320-bit integer. Optimized with MULX instruction. #define MULS_128x320_MULX(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ MULS_128x320(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, ADDQ, ADDQ, ADCQ, ADCQ) // Multiplies 128-bit with 320-bit integer. Optimized with MULX, ADOX and ADCX instructions #define MULS_128x320_MULX_ADCX_ADOX(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ MULS_128x320(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, ADOXQ, ADCXQ, ADOXQ, ADCXQ) // Template of a macro performing multiplication of two 512-bit numbers. It uses one // level of Karatsuba and one level of schoolbook multiplication. Template must be // customized with macro performing schoolbook multiplication. // Input: // * I0, I1 - two 512-bit numbers // * MULS - either MULS256_MULX or MULS256_MULX_ADCX_ADOX // Output: OUT - 1024-bit long #define MUL(OUT, I0, I1, MULS) \ \ // R[8-11]: U1+U0 XORQ AX, AX \ MOVQ ( 0)(I0), R8 \ MOVQ ( 8)(I0), R9 \ MOVQ (16)(I0), R10 \ MOVQ (24)(I0), R11 \ ADDQ (32)(I0), R8 \ ADCQ (40)(I0), R9 \ ADCQ (48)(I0), R10 \ ADCQ (56)(I0), R11 \ SBBQ $0, AX \ // store mask MOVQ R8, ( 0)(SP) \ MOVQ R9, ( 8)(SP) \ MOVQ R10, (16)(SP) \ MOVQ R11, (24)(SP) \ \ \ // R[12-15]: V1+V0 XORQ BX, BX \ MOVQ ( 0)(I1), R12 \ MOVQ ( 8)(I1), R13 \ MOVQ (16)(I1), R14 \ MOVQ (24)(I1), R15 \ ADDQ (32)(I1), R12 \ ADCQ (40)(I1), R13 \ ADCQ (48)(I1), R14 \ ADCQ (56)(I1), R15 \ SBBQ $0, BX \ // store mask MOVQ R12, (32)(SP) \ MOVQ R13, (40)(SP) \ MOVQ R14, (48)(SP) \ MOVQ R15, (56)(SP) \ \ // Prepare mask for U0+U1 (U1+U0 mod 256^4 if U1+U0 sets carry flag, otherwise 0) ANDQ AX, R12 \ ANDQ AX, R13 \ ANDQ AX, R14 \ ANDQ AX, R15 \ \ // Prepare mask for V0+V1 (V1+V0 mod 256^4 if U1+U0 sets carry flag, otherwise 0) ANDQ BX, R8 \ ANDQ BX, R9 \ ANDQ BX, R10 \ ANDQ BX, R11 \ \ // res = masked(U0+U1) + masked(V0 + V1) ADDQ R12, R8 \ ADCQ R13, R9 \ ADCQ R14, R10 \ ADCQ R15, R11 \ \ // SP[64-96] <- res MOVQ R8, (64)(SP) \ MOVQ R9, (72)(SP) \ MOVQ R10, (80)(SP) \ MOVQ R11, (88)(SP) \ \ // BP will be used for schoolbook multiplication below MOVQ BP, 96(SP) \ \ // (U1+U0)*(V1+V0) MULS((64)(OUT), 0(SP), 32(SP), R8, R9, R10, R11, R12, R13, R14, R15, BX, BP) \ \ // U0 x V0 MULS(0(OUT), 0(I0), 0(I1), R8, R9, R10, R11, R12, R13, R14, R15, BX, BP) \ \ // U1 x V1 MULS(0(SP), 32(I0), 32(I1), R8, R9, R10, R11, R12, R13, R14, R15, BX, BP) \ \ // Recover BP MOVQ 96(SP), BP \ \ // Final part of schoolbook multiplication; R[8-11] = (U0+U1) x (V0+V1) MOVQ (64)(SP), R8 \ MOVQ (72)(SP), R9 \ MOVQ (80)(SP), R10 \ MOVQ (88)(SP), R11 \ MOVQ (96)(OUT), AX \ ADDQ AX, R8 \ MOVQ (104)(OUT), AX \ ADCQ AX, R9 \ MOVQ (112)(OUT), AX \ ADCQ AX, R10 \ MOVQ (120)(OUT), AX \ ADCQ AX, R11 \ \ // R[12-15, 8-11] = (U0+U1) x (V0+V1) - U0xV0 MOVQ (64)(OUT), R12 \ MOVQ (72)(OUT), R13 \ MOVQ (80)(OUT), R14 \ MOVQ (88)(OUT), R15 \ SUBQ ( 0)(OUT), R12 \ SBBQ ( 8)(OUT), R13 \ SBBQ (16)(OUT), R14 \ SBBQ (24)(OUT), R15 \ SBBQ (32)(OUT), R8 \ SBBQ (40)(OUT), R9 \ SBBQ (48)(OUT), R10 \ SBBQ (56)(OUT), R11 \ \ // r8-r15 <- (U0+U1) x (V0+V1) - U0xV0 - U1xV1 SUBQ ( 0)(SP), R12 \ SBBQ ( 8)(SP), R13 \ SBBQ (16)(SP), R14 \ SBBQ (24)(SP), R15 \ SBBQ (32)(SP), R8 \ SBBQ (40)(SP), R9 \ SBBQ (48)(SP), R10 \ SBBQ (56)(SP), R11 \ \ ; ADDQ (32)(OUT), R12; MOVQ R12, ( 32)(OUT) \ ; ADCQ (40)(OUT), R13; MOVQ R13, ( 40)(OUT) \ ; ADCQ (48)(OUT), R14; MOVQ R14, ( 48)(OUT) \ ; ADCQ (56)(OUT), R15; MOVQ R15, ( 56)(OUT) \ MOVQ ( 0)(SP), AX; ADCQ AX, R8; MOVQ R8, ( 64)(OUT) \ MOVQ ( 8)(SP), AX; ADCQ AX, R9; MOVQ R9, ( 72)(OUT) \ MOVQ (16)(SP), AX; ADCQ AX, R10; MOVQ R10, ( 80)(OUT) \ MOVQ (24)(SP), AX; ADCQ AX, R11; MOVQ R11, ( 88)(OUT) \ MOVQ (32)(SP), R12; ADCQ $0, R12; MOVQ R12, ( 96)(OUT) \ MOVQ (40)(SP), R13; ADCQ $0, R13; MOVQ R13, (104)(OUT) \ MOVQ (48)(SP), R14; ADCQ $0, R14; MOVQ R14, (112)(OUT) \ MOVQ (56)(SP), R15; ADCQ $0, R15; MOVQ R15, (120)(OUT) // Template for calculating the Montgomery reduction algorithm described in // section 5.2.3 of https://eprint.iacr.org/2017/1015.pdf. Template must be // customized with schoolbook multiplicaton for 128 x 320-bit number. // This macro reuses memory of IN value and *changes* it. Smashes registers // R[8-15], BX, CX // Input: // * IN: 1024-bit number to be reduced // * MULS: either MULS_128x320_MULX or MULS_128x320_MULX_ADCX_ADOX // Output: OUT 512-bit #define REDC(OUT, IN, MULS) \ MULS(0(IN), ·p503p1, R8, R9, R10, R11, R12, R13, R14, BX, CX, R15) \ XORQ R15, R15 \ ADDQ (24)(IN), R8 \ ADCQ (32)(IN), R9 \ ADCQ (40)(IN), R10 \ ADCQ (48)(IN), R11 \ ADCQ (56)(IN), R12 \ ADCQ (64)(IN), R13 \ ADCQ (72)(IN), R14 \ ADCQ (80)(IN), R15 \ MOVQ R8, (24)(IN) \ MOVQ R9, (32)(IN) \ MOVQ R10, (40)(IN) \ MOVQ R11, (48)(IN) \ MOVQ R12, (56)(IN) \ MOVQ R13, (64)(IN) \ MOVQ R14, (72)(IN) \ MOVQ R15, (80)(IN) \ MOVQ (88)(IN), R8 \ MOVQ (96)(IN), R9 \ MOVQ (104)(IN), R10 \ MOVQ (112)(IN), R11 \ MOVQ (120)(IN), R12 \ ADCQ $0, R8 \ ADCQ $0, R9 \ ADCQ $0, R10 \ ADCQ $0, R11 \ ADCQ $0, R12 \ MOVQ R8, (88)(IN) \ MOVQ R9, (96)(IN) \ MOVQ R10, (104)(IN) \ MOVQ R11, (112)(IN) \ MOVQ R12, (120)(IN) \ \ MULS(16(IN), ·p503p1, R8, R9, R10, R11, R12, R13, R14, BX, CX, R15) \ XORQ R15, R15 \ ADDQ (40)(IN), R8 \ ADCQ (48)(IN), R9 \ ADCQ (56)(IN), R10 \ ADCQ (64)(IN), R11 \ ADCQ (72)(IN), R12 \ ADCQ (80)(IN), R13 \ ADCQ (88)(IN), R14 \ ADCQ (96)(IN), R15 \ MOVQ R8, (40)(IN) \ MOVQ R9, (48)(IN) \ MOVQ R10, (56)(IN) \ MOVQ R11, (64)(IN) \ MOVQ R12, (72)(IN) \ MOVQ R13, (80)(IN) \ MOVQ R14, (88)(IN) \ MOVQ R15, (96)(IN) \ MOVQ (104)(IN), R8 \ MOVQ (112)(IN), R9 \ MOVQ (120)(IN), R10 \ ADCQ $0, R8 \ ADCQ $0, R9 \ ADCQ $0, R10 \ MOVQ R8, (104)(IN) \ MOVQ R9, (112)(IN) \ MOVQ R10, (120)(IN) \ \ MULS(32(IN), ·p503p1, R8, R9, R10, R11, R12, R13, R14, BX, CX, R15) \ XORQ R15, R15 \ XORQ BX, BX \ ADDQ ( 56)(IN), R8 \ ADCQ ( 64)(IN), R9 \ ADCQ ( 72)(IN), R10 \ ADCQ ( 80)(IN), R11 \ ADCQ ( 88)(IN), R12 \ ADCQ ( 96)(IN), R13 \ ADCQ (104)(IN), R14 \ ADCQ (112)(IN), R15 \ ADCQ (120)(IN), BX \ MOVQ R8, ( 56)(IN) \ MOVQ R10, ( 72)(IN) \ MOVQ R11, ( 80)(IN) \ MOVQ R12, ( 88)(IN) \ MOVQ R13, ( 96)(IN) \ MOVQ R14, (104)(IN) \ MOVQ R15, (112)(IN) \ MOVQ BX, (120)(IN) \ MOVQ R9, ( 0)(OUT) \ // Result: OUT[0] \ MULS(48(IN), ·p503p1, R8, R9, R10, R11, R12, R13, R14, BX, CX, R15) \ ADDQ ( 72)(IN), R8 \ ADCQ ( 80)(IN), R9 \ ADCQ ( 88)(IN), R10 \ ADCQ ( 96)(IN), R11 \ ADCQ (104)(IN), R12 \ ADCQ (112)(IN), R13 \ ADCQ (120)(IN), R14 \ MOVQ R8, ( 8)(OUT) \ // Result: OUT[1] MOVQ R9, (16)(OUT) \ // Result: OUT[2] MOVQ R10, (24)(OUT) \ // Result: OUT[3] MOVQ R11, (32)(OUT) \ // Result: OUT[4] MOVQ R12, (40)(OUT) \ // Result: OUT[5] MOVQ R13, (48)(OUT) \ // Result: OUT[6] and OUT[7] MOVQ R14, (56)(OUT) TEXT ·fp503StrongReduce(SB), NOSPLIT, $0-8 MOVQ x+0(FP), REG_P1 // Zero AX for later use: XORQ AX, AX // Load p into registers: MOVQ P503_0, R8 // P503_{1,2} = P503_0, so reuse R8 MOVQ P503_3, R9 MOVQ P503_4, R10 MOVQ P503_5, R11 MOVQ P503_6, R12 MOVQ P503_7, R13 // Set x <- x - p SUBQ R8, ( 0)(REG_P1) SBBQ R8, ( 8)(REG_P1) SBBQ R8, (16)(REG_P1) SBBQ R9, (24)(REG_P1) SBBQ R10, (32)(REG_P1) SBBQ R11, (40)(REG_P1) SBBQ R12, (48)(REG_P1) SBBQ R13, (56)(REG_P1) // Save carry flag indicating x-p < 0 as a mask SBBQ $0, AX // Conditionally add p to x if x-p < 0 ANDQ AX, R8 ANDQ AX, R9 ANDQ AX, R10 ANDQ AX, R11 ANDQ AX, R12 ANDQ AX, R13 ADDQ R8, ( 0)(REG_P1) ADCQ R8, ( 8)(REG_P1) ADCQ R8, (16)(REG_P1) ADCQ R9, (24)(REG_P1) ADCQ R10,(32)(REG_P1) ADCQ R11,(40)(REG_P1) ADCQ R12,(48)(REG_P1) ADCQ R13,(56)(REG_P1) RET TEXT ·fp503ConditionalSwap(SB),NOSPLIT,$0-17 MOVQ x+0(FP), REG_P1 MOVQ y+8(FP), REG_P2 MOVB choice+16(FP), AL // AL = 0 or 1 MOVBLZX AL, AX // AX = 0 or 1 NEGQ AX // AX = 0x00..00 or 0xff..ff #ifndef CSWAP_BLOCK #define CSWAP_BLOCK(idx) \ MOVQ (idx*8)(REG_P1), BX \ // BX = x[idx] MOVQ (idx*8)(REG_P2), CX \ // CX = y[idx] MOVQ CX, DX \ // DX = y[idx] XORQ BX, DX \ // DX = y[idx] ^ x[idx] ANDQ AX, DX \ // DX = (y[idx] ^ x[idx]) & mask XORQ DX, BX \ // BX = (y[idx] ^ x[idx]) & mask) ^ x[idx] = x[idx] or y[idx] XORQ DX, CX \ // CX = (y[idx] ^ x[idx]) & mask) ^ y[idx] = y[idx] or x[idx] MOVQ BX, (idx*8)(REG_P1) \ MOVQ CX, (idx*8)(REG_P2) #endif CSWAP_BLOCK(0) CSWAP_BLOCK(1) CSWAP_BLOCK(2) CSWAP_BLOCK(3) CSWAP_BLOCK(4) CSWAP_BLOCK(5) CSWAP_BLOCK(6) CSWAP_BLOCK(7) #ifdef CSWAP_BLOCK #undef CSWAP_BLOCK #endif RET TEXT ·fp503AddReduced(SB),NOSPLIT,$0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 // Used later to calculate a mask XORQ CX, CX // [R8-R15]: z = x + y MOVQ ( 0)(REG_P1), R8 MOVQ ( 8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 ADDQ ( 0)(REG_P2), R8 ADCQ ( 8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 ADCQ (48)(REG_P2), R14 ADCQ (56)(REG_P2), R15 MOVQ P503X2_0, AX SUBQ AX, R8 MOVQ P503X2_1, AX SBBQ AX, R9 SBBQ AX, R10 MOVQ P503X2_3, AX SBBQ AX, R11 MOVQ P503X2_4, AX SBBQ AX, R12 MOVQ P503X2_5, AX SBBQ AX, R13 MOVQ P503X2_6, AX SBBQ AX, R14 MOVQ P503X2_7, AX SBBQ AX, R15 // mask SBBQ $0, CX // move z to REG_P3 MOVQ R8, ( 0)(REG_P3) MOVQ R9, ( 8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) // if z<0 add p503x2 back MOVQ P503X2_0, R8 MOVQ P503X2_1, R9 MOVQ P503X2_3, R10 MOVQ P503X2_4, R11 MOVQ P503X2_5, R12 MOVQ P503X2_6, R13 MOVQ P503X2_7, R14 ANDQ CX, R8 ANDQ CX, R9 ANDQ CX, R10 ANDQ CX, R11 ANDQ CX, R12 ANDQ CX, R13 ANDQ CX, R14 MOVQ ( 0)(REG_P3), AX; ADDQ R8, AX; MOVQ AX, ( 0)(REG_P3) MOVQ ( 8)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, ( 8)(REG_P3) MOVQ (16)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, (16)(REG_P3) MOVQ (24)(REG_P3), AX; ADCQ R10, AX; MOVQ AX, (24)(REG_P3) MOVQ (32)(REG_P3), AX; ADCQ R11, AX; MOVQ AX, (32)(REG_P3) MOVQ (40)(REG_P3), AX; ADCQ R12, AX; MOVQ AX, (40)(REG_P3) MOVQ (48)(REG_P3), AX; ADCQ R13, AX; MOVQ AX, (48)(REG_P3) MOVQ (56)(REG_P3), AX; ADCQ R14, AX; MOVQ AX, (56)(REG_P3) RET TEXT ·fp503SubReduced(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 // Used later to calculate a mask XORQ CX, CX MOVQ ( 0)(REG_P1), R8 MOVQ ( 8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 SUBQ ( 0)(REG_P2), R8 SBBQ ( 8)(REG_P2), R9 SBBQ (16)(REG_P2), R10 SBBQ (24)(REG_P2), R11 SBBQ (32)(REG_P2), R12 SBBQ (40)(REG_P2), R13 SBBQ (48)(REG_P2), R14 SBBQ (56)(REG_P2), R15 // mask SBBQ $0, CX // store x-y in REG_P3 MOVQ R8, ( 0)(REG_P3) MOVQ R9, ( 8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) // if z<0 add p503x2 back MOVQ P503X2_0, R8 MOVQ P503X2_1, R9 MOVQ P503X2_3, R10 MOVQ P503X2_4, R11 MOVQ P503X2_5, R12 MOVQ P503X2_6, R13 MOVQ P503X2_7, R14 ANDQ CX, R8 ANDQ CX, R9 ANDQ CX, R10 ANDQ CX, R11 ANDQ CX, R12 ANDQ CX, R13 ANDQ CX, R14 MOVQ ( 0)(REG_P3), AX; ADDQ R8, AX; MOVQ AX, ( 0)(REG_P3) MOVQ ( 8)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, ( 8)(REG_P3) MOVQ (16)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, (16)(REG_P3) MOVQ (24)(REG_P3), AX; ADCQ R10, AX; MOVQ AX, (24)(REG_P3) MOVQ (32)(REG_P3), AX; ADCQ R11, AX; MOVQ AX, (32)(REG_P3) MOVQ (40)(REG_P3), AX; ADCQ R12, AX; MOVQ AX, (40)(REG_P3) MOVQ (48)(REG_P3), AX; ADCQ R13, AX; MOVQ AX, (48)(REG_P3) MOVQ (56)(REG_P3), AX; ADCQ R14, AX; MOVQ AX, (56)(REG_P3) RET TEXT ·fp503Mul(SB), NOSPLIT, $104-24 MOVQ z+ 0(FP), CX MOVQ x+ 8(FP), REG_P1 MOVQ y+16(FP), REG_P2 // Check wether to use optimized implementation CMPB ·HasADXandBMI2(SB), $1 JE mul_with_mulx_adcx_adox CMPB ·HasBMI2(SB), $1 JE mul_with_mulx // Generic x86 implementation (below) uses variant of Karatsuba method. // // Here we store the destination in CX instead of in REG_P3 because the // multiplication instructions use DX as an implicit destination // operand: MULQ $REG sets DX:AX <-- AX * $REG. // RAX and RDX will be used for a mask (0-borrow) XORQ AX, AX // RCX[0-3]: U1+U0 MOVQ (32)(REG_P1), R8 MOVQ (40)(REG_P1), R9 MOVQ (48)(REG_P1), R10 MOVQ (56)(REG_P1), R11 ADDQ ( 0)(REG_P1), R8 ADCQ ( 8)(REG_P1), R9 ADCQ (16)(REG_P1), R10 ADCQ (24)(REG_P1), R11 MOVQ R8, ( 0)(CX) MOVQ R9, ( 8)(CX) MOVQ R10, (16)(CX) MOVQ R11, (24)(CX) SBBQ $0, AX // R12-R15: V1+V0 XORQ DX, DX MOVQ (32)(REG_P2), R12 MOVQ (40)(REG_P2), R13 MOVQ (48)(REG_P2), R14 MOVQ (56)(REG_P2), R15 ADDQ ( 0)(REG_P2), R12 ADCQ ( 8)(REG_P2), R13 ADCQ (16)(REG_P2), R14 ADCQ (24)(REG_P2), R15 SBBQ $0, DX // Store carries on stack MOVQ AX, (64)(SP) MOVQ DX, (72)(SP) // (SP[0-3],R8,R9,R10,R11) <- (U0+U1)*(V0+V1). // MUL using comba; In comments below U=U0+U1 V=V0+V1 // U0*V0 MOVQ (CX), AX MULQ R12 MOVQ AX, (SP) // C0 MOVQ DX, R8 // U0*V1 XORQ R9, R9 MOVQ (CX), AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 // U1*V0 XORQ R10, R10 MOVQ (8)(CX), AX MULQ R12 ADDQ AX, R8 MOVQ R8, (8)(SP) // C1 ADCQ DX, R9 ADCQ $0, R10 // U0*V2 XORQ R8, R8 MOVQ (CX), AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 // U2*V0 MOVQ (16)(CX), AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 // U1*V1 MOVQ (8)(CX), AX MULQ R13 ADDQ AX, R9 MOVQ R9, (16)(SP) // C2 ADCQ DX, R10 ADCQ $0, R8 // U0*V3 XORQ R9, R9 MOVQ (CX), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 // U3*V0 MOVQ (24)(CX), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 // U1*V2 MOVQ (8)(CX), AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 // U2*V1 MOVQ (16)(CX), AX MULQ R13 ADDQ AX, R10 MOVQ R10, (24)(SP) // C3 ADCQ DX, R8 ADCQ $0, R9 // U1*V3 XORQ R10, R10 MOVQ (8)(CX), AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 // U3*V1 MOVQ (24)(CX), AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 // U2*V2 MOVQ (16)(CX), AX MULQ R14 ADDQ AX, R8 MOVQ R8, (32)(SP) // C4 ADCQ DX, R9 ADCQ $0, R10 // U2*V3 XORQ R11, R11 MOVQ (16)(CX), AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R11 // U3*V2 MOVQ (24)(CX), AX MULQ R14 ADDQ AX, R9 // C5 ADCQ DX, R10 ADCQ $0, R11 // U3*V3 MOVQ (24)(CX), AX MULQ R15 ADDQ AX, R10 // C6 ADCQ DX, R11 // C7 MOVQ (64)(SP), AX ANDQ AX, R12 ANDQ AX, R13 ANDQ AX, R14 ANDQ AX, R15 ADDQ R8, R12 ADCQ R9, R13 ADCQ R10, R14 ADCQ R11, R15 MOVQ (72)(SP), AX MOVQ (CX), R8 MOVQ (8)(CX), R9 MOVQ (16)(CX), R10 MOVQ (24)(CX), R11 ANDQ AX, R8 ANDQ AX, R9 ANDQ AX, R10 ANDQ AX, R11 ADDQ R12, R8 ADCQ R13, R9 ADCQ R14, R10 ADCQ R15, R11 MOVQ R8, (32)(SP) MOVQ R9, (40)(SP) MOVQ R10, (48)(SP) MOVQ R11, (56)(SP) // CX[0-7] <- AL*BL // U0*V0 MOVQ (REG_P1), R11 MOVQ (REG_P2), AX MULQ R11 XORQ R9, R9 MOVQ AX, (CX) // C0 MOVQ DX, R8 // U0*V1 MOVQ (16)(REG_P1), R14 MOVQ (8)(REG_P2), AX MULQ R11 XORQ R10, R10 ADDQ AX, R8 ADCQ DX, R9 // U1*V0 MOVQ (8)(REG_P1), R12 MOVQ (REG_P2), AX MULQ R12 ADDQ AX, R8 MOVQ R8, (8)(CX) // C1 ADCQ DX, R9 ADCQ $0, R10 // U0*V2 XORQ R8, R8 MOVQ (16)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 // U2*V0 MOVQ (REG_P2), R13 MOVQ R14, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 // U1*V1 MOVQ (8)(REG_P2), AX MULQ R12 ADDQ AX, R9 MOVQ R9, (16)(CX) // C2 ADCQ DX, R10 ADCQ $0, R8 // U0*V3 XORQ R9, R9 MOVQ (24)(REG_P2), AX MULQ R11 MOVQ (24)(REG_P1), R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 // U3*V1 MOVQ R15, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 // U2*V2 MOVQ (16)(REG_P2), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 // U2*V3 MOVQ (8)(REG_P2), AX MULQ R14 ADDQ AX, R10 MOVQ R10, (24)(CX) // C3 ADCQ DX, R8 ADCQ $0, R9 // U3*V2 XORQ R10, R10 MOVQ (24)(REG_P2), AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 // U3*V1 MOVQ (8)(REG_P2), AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 // U2*V2 MOVQ (16)(REG_P2), AX MULQ R14 ADDQ AX, R8 MOVQ R8, (32)(CX) // C4 ADCQ DX, R9 ADCQ $0, R10 // U2*V3 XORQ R8, R8 MOVQ (24)(REG_P2), AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 // U3*V2 MOVQ (16)(REG_P2), AX MULQ R15 ADDQ AX, R9 MOVQ R9, (40)(CX) // C5 ADCQ DX, R10 ADCQ $0, R8 // U3*V3 MOVQ (24)(REG_P2), AX MULQ R15 ADDQ AX, R10 MOVQ R10, (48)(CX) // C6 ADCQ DX, R8 MOVQ R8, (56)(CX) // C7 // CX[8-15] <- U1*V1 MOVQ (32)(REG_P1), R11 MOVQ (32)(REG_P2), AX MULQ R11 XORQ R9, R9 MOVQ AX, (64)(CX) // C0 MOVQ DX, R8 MOVQ (48)(REG_P1), R14 MOVQ (40)(REG_P2), AX MULQ R11 XORQ R10, R10 ADDQ AX, R8 ADCQ DX, R9 MOVQ (40)(REG_P1), R12 MOVQ (32)(REG_P2), AX MULQ R12 ADDQ AX, R8 MOVQ R8, (72)(CX) // C1 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (48)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (32)(REG_P2), R13 MOVQ R14, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (40)(REG_P2), AX MULQ R12 ADDQ AX, R9 MOVQ R9, (80)(CX) // C2 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (56)(REG_P2), AX MULQ R11 MOVQ (56)(REG_P1), R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ R15, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (48)(REG_P2), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (40)(REG_P2), AX MULQ R14 ADDQ AX, R10 MOVQ R10, (88)(CX) // C3 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (56)(REG_P2), AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (40)(REG_P2), AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (48)(REG_P2), AX MULQ R14 ADDQ AX, R8 MOVQ R8, (96)(CX) // C4 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (56)(REG_P2), AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (48)(REG_P2), AX MULQ R15 ADDQ AX, R9 MOVQ R9, (104)(CX) // C5 ADCQ DX, R10 ADCQ $0, R8 MOVQ (56)(REG_P2), AX MULQ R15 ADDQ AX, R10 MOVQ R10, (112)(CX) // C6 ADCQ DX, R8 MOVQ R8, (120)(CX) // C7 // [R8-R15] <- (U0+U1)*(V0+V1) - U1*V1 MOVQ (SP), R8 SUBQ (CX), R8 MOVQ (8)(SP), R9 SBBQ (8)(CX), R9 MOVQ (16)(SP), R10 SBBQ (16)(CX), R10 MOVQ (24)(SP), R11 SBBQ (24)(CX), R11 MOVQ (32)(SP), R12 SBBQ (32)(CX), R12 MOVQ (40)(SP), R13 SBBQ (40)(CX), R13 MOVQ (48)(SP), R14 SBBQ (48)(CX), R14 MOVQ (56)(SP), R15 SBBQ (56)(CX), R15 // [R8-R15] <- (U0+U1)*(V0+V1) - U1*V0 - U0*U1 MOVQ ( 64)(CX), AX; SUBQ AX, R8 MOVQ ( 72)(CX), AX; SBBQ AX, R9 MOVQ ( 80)(CX), AX; SBBQ AX, R10 MOVQ ( 88)(CX), AX; SBBQ AX, R11 MOVQ ( 96)(CX), AX; SBBQ AX, R12 MOVQ (104)(CX), DX; SBBQ DX, R13 MOVQ (112)(CX), DI; SBBQ DI, R14 MOVQ (120)(CX), SI; SBBQ SI, R15 // Final result ADDQ (32)(CX), R8; MOVQ R8, (32)(CX) ADCQ (40)(CX), R9; MOVQ R9, (40)(CX) ADCQ (48)(CX), R10; MOVQ R10, (48)(CX) ADCQ (56)(CX), R11; MOVQ R11, (56)(CX) ADCQ (64)(CX), R12; MOVQ R12, (64)(CX) ADCQ (72)(CX), R13; MOVQ R13, (72)(CX) ADCQ (80)(CX), R14; MOVQ R14, (80)(CX) ADCQ (88)(CX), R15; MOVQ R15, (88)(CX) ADCQ $0, AX; MOVQ AX, (96)(CX) ADCQ $0, DX; MOVQ DX, (104)(CX) ADCQ $0, DI; MOVQ DI, (112)(CX) ADCQ $0, SI; MOVQ SI, (120)(CX) RET mul_with_mulx_adcx_adox: // Mul implementation for CPUs supporting two independent carry chain // (ADOX/ADCX) instructions and carry-less MULX multiplier MUL(CX, REG_P1, REG_P2, MULS256_MULX_ADCX_ADOX) RET mul_with_mulx: // Mul implementation for CPUs supporting carry-less MULX multiplier. MUL(CX, REG_P1, REG_P2, MULS256_MULX) RET TEXT ·fp503MontgomeryReduce(SB), $0-16 MOVQ z+0(FP), REG_P2 MOVQ x+8(FP), REG_P1 // Check wether to use optimized implementation CMPB ·HasADXandBMI2(SB), $1 JE redc_with_mulx_adcx_adox CMPB ·HasBMI2(SB), $1 JE redc_with_mulx MOVQ (REG_P1), R11 MOVQ P503P1_3, AX MULQ R11 XORQ R8, R8 ADDQ (24)(REG_P1), AX MOVQ AX, (24)(REG_P2) ADCQ DX, R8 XORQ R9, R9 MOVQ P503P1_4, AX MULQ R11 XORQ R10, R10 ADDQ AX, R8 ADCQ DX, R9 MOVQ (8)(REG_P1), R12 MOVQ P503P1_3, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (32)(REG_P1), R8 MOVQ R8, (32)(REG_P2) // Z4 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P503P1_5, AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_4, AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (16)(REG_P1), R13 MOVQ P503P1_3, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (40)(REG_P1), R9 MOVQ R9, (40)(REG_P2) // Z5 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P503P1_6, AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_5, AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_4, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (24)(REG_P2), R14 MOVQ P503P1_3, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (48)(REG_P1), R10 MOVQ R10, (48)(REG_P2) // Z6 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P503P1_7, AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_6, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_5, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_4, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (32)(REG_P2), R15 MOVQ P503P1_3, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (56)(REG_P1), R8 MOVQ R8, (56)(REG_P2) // Z7 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P503P1_7, AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_6, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_5, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_4, AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (40)(REG_P2), CX MOVQ P503P1_3, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (64)(REG_P1), R9 MOVQ R9, (REG_P2) // Z0 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P503P1_7, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_6, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_5, AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_4, AX MULQ CX ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (48)(REG_P2), R13 MOVQ P503P1_3, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (72)(REG_P1), R10 MOVQ R10, (8)(REG_P2) // Z1 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P503P1_7, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_6, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_5, AX MULQ CX ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_4, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (56)(REG_P2), R14 MOVQ P503P1_3, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (80)(REG_P1), R8 MOVQ R8, (16)(REG_P2) // Z2 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P503P1_7, AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_6, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_5, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_4, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (88)(REG_P1), R9 MOVQ R9, (24)(REG_P2) // Z3 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P503P1_7, AX MULQ CX ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_6, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_5, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (96)(REG_P1), R10 MOVQ R10, (32)(REG_P2) // Z4 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P503P1_7, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_6, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (104)(REG_P1), R8 // Z5 MOVQ R8, (40)(REG_P2) // Z5 ADCQ $0, R9 ADCQ $0, R10 MOVQ P503P1_7, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADDQ (112)(REG_P1), R9 // Z6 MOVQ R9, (48)(REG_P2) // Z6 ADCQ $0, R10 ADDQ (120)(REG_P1), R10 // Z7 MOVQ R10, (56)(REG_P2) // Z7 RET redc_with_mulx_adcx_adox: // Implementation of the Montgomery reduction for CPUs // supporting two independent carry chain (ADOX/ADCX) // instructions and carry-less MULX multiplier REDC(REG_P2, REG_P1, MULS_128x320_MULX_ADCX_ADOX) RET redc_with_mulx: // Implementation of the Montgomery reduction for CPUs // supporting carry-less MULX multiplier. REDC(REG_P2, REG_P1, MULS_128x320_MULX) RET TEXT ·fp503AddLazy(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 ADDQ (REG_P2), R8 ADCQ (8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 ADCQ (48)(REG_P2), R14 ADCQ (56)(REG_P2), R15 MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) RET TEXT ·fp503X2AddLazy(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), AX MOVQ (72)(REG_P1), BX MOVQ (80)(REG_P1), CX ADDQ (REG_P2), R8 ADCQ (8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 ADCQ (48)(REG_P2), R14 ADCQ (56)(REG_P2), R15 ADCQ (64)(REG_P2), AX ADCQ (72)(REG_P2), BX ADCQ (80)(REG_P2), CX MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ AX, (64)(REG_P3) MOVQ BX, (72)(REG_P3) MOVQ CX, (80)(REG_P3) MOVQ (88)(REG_P1), R8 MOVQ (96)(REG_P1), R9 MOVQ (104)(REG_P1), R10 MOVQ (112)(REG_P1), R11 MOVQ (120)(REG_P1), R12 ADCQ (88)(REG_P2), R8 ADCQ (96)(REG_P2), R9 ADCQ (104)(REG_P2), R10 ADCQ (112)(REG_P2), R11 ADCQ (120)(REG_P2), R12 MOVQ R8, (88)(REG_P3) MOVQ R9, (96)(REG_P3) MOVQ R10, (104)(REG_P3) MOVQ R11, (112)(REG_P3) MOVQ R12, (120)(REG_P3) RET TEXT ·fp503X2SubLazy(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 // Used later to store result of 0-borrow XORQ CX, CX // SUBC for first 11 limbs MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), AX MOVQ (72)(REG_P1), BX SUBQ (REG_P2), R8 SBBQ (8)(REG_P2), R9 SBBQ (16)(REG_P2), R10 SBBQ (24)(REG_P2), R11 SBBQ (32)(REG_P2), R12 SBBQ (40)(REG_P2), R13 SBBQ (48)(REG_P2), R14 SBBQ (56)(REG_P2), R15 SBBQ (64)(REG_P2), AX SBBQ (72)(REG_P2), BX MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ AX, (64)(REG_P3) MOVQ BX, (72)(REG_P3) // SUBC for last 5 limbs MOVQ (80)(REG_P1), R8 MOVQ (88)(REG_P1), R9 MOVQ (96)(REG_P1), R10 MOVQ (104)(REG_P1), R11 MOVQ (112)(REG_P1), R12 MOVQ (120)(REG_P1), R13 SBBQ (80)(REG_P2), R8 SBBQ (88)(REG_P2), R9 SBBQ (96)(REG_P2), R10 SBBQ (104)(REG_P2), R11 SBBQ (112)(REG_P2), R12 SBBQ (120)(REG_P2), R13 MOVQ R8, (80)(REG_P3) MOVQ R9, (88)(REG_P3) MOVQ R10, (96)(REG_P3) MOVQ R11, (104)(REG_P3) MOVQ R12, (112)(REG_P3) MOVQ R13, (120)(REG_P3) // Now the carry flag is 1 if x-y < 0. If so, add p*2^512. SBBQ $0, CX // Load p into registers: MOVQ P503_0, R8 // P503_{1,2} = P503_0, so reuse R8 MOVQ P503_3, R9 MOVQ P503_4, R10 MOVQ P503_5, R11 MOVQ P503_6, R12 MOVQ P503_7, R13 ANDQ CX, R8 ANDQ CX, R9 ANDQ CX, R10 ANDQ CX, R11 ANDQ CX, R12 ANDQ CX, R13 MOVQ (64 )(REG_P3), AX; ADDQ R8, AX; MOVQ AX, (64 )(REG_P3) MOVQ (64+ 8)(REG_P3), AX; ADCQ R8, AX; MOVQ AX, (64+ 8)(REG_P3) MOVQ (64+16)(REG_P3), AX; ADCQ R8, AX; MOVQ AX, (64+16)(REG_P3) MOVQ (64+24)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, (64+24)(REG_P3) MOVQ (64+32)(REG_P3), AX; ADCQ R10, AX; MOVQ AX, (64+32)(REG_P3) MOVQ (64+40)(REG_P3), AX; ADCQ R11, AX; MOVQ AX, (64+40)(REG_P3) MOVQ (64+48)(REG_P3), AX; ADCQ R12, AX; MOVQ AX, (64+48)(REG_P3) MOVQ (64+56)(REG_P3), AX; ADCQ R13, AX; MOVQ AX, (64+56)(REG_P3) RET golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p503/arith_amd64_test.go000066400000000000000000000076661343600534300260230ustar00rootroot00000000000000// +build amd64,!noasm package p503 import ( . "github.com/cloudflare/sidh/internal/isogeny" cpu "github.com/cloudflare/sidh/internal/utils" "reflect" "testing" "testing/quick" ) type OptimFlag uint const ( // Indicates that optimisation which uses MUL instruction should be used kUse_MUL OptimFlag = 1 << 0 // Indicates that optimisation which uses MULX instruction should be used kUse_MULX = 1 << 1 // Indicates that optimisation which uses MULX, ADOX and ADCX instructions should be used kUse_MULXandADxX = 1 << 2 ) func resetCpuFeatures() { HasBMI2 = cpu.X86.HasBMI2 HasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX } // Utility function used for testing Mul implementations. Tests caller provided // mulFunc against mul() func testMul(t *testing.T, f1, f2 OptimFlag) { doMulTest := func(multiplier, multiplicant FpElement) bool { defer resetCpuFeatures() var resMulRef, resMulOptim FpElementX2 // Compute multiplier*multiplicant with first implementation HasBMI2 = (kUse_MULX & f1) == kUse_MULX HasADXandBMI2 = (kUse_MULXandADxX & f1) == kUse_MULXandADxX fp503Mul(&resMulOptim, &multiplier, &multiplicant) // Compute multiplier*multiplicant with second implementation HasBMI2 = (kUse_MULX & f2) == kUse_MULX HasADXandBMI2 = (kUse_MULXandADxX & f2) == kUse_MULXandADxX fp503Mul(&resMulRef, &multiplier, &multiplicant) // Compare results return reflect.DeepEqual(resMulRef, resMulOptim) } if err := quick.Check(doMulTest, quickCheckConfig); err != nil { t.Error(err) } } // Utility function used for testing REDC implementations. Tests caller provided // redcFunc against redc() func testRedc(t *testing.T, f1, f2 OptimFlag) { doRedcTest := func(aRR FpElementX2) bool { defer resetCpuFeatures() var resRedcF1, resRedcF2 FpElement var aRRcpy = aRR // Compute redc with first implementation HasBMI2 = (kUse_MULX & f1) == kUse_MULX HasADXandBMI2 = (kUse_MULXandADxX & f1) == kUse_MULXandADxX fp503MontgomeryReduce(&resRedcF1, &aRR) // Compute redc with second implementation HasBMI2 = (kUse_MULX & f2) == kUse_MULX HasADXandBMI2 = (kUse_MULXandADxX & f2) == kUse_MULXandADxX fp503MontgomeryReduce(&resRedcF2, &aRRcpy) // Compare results return reflect.DeepEqual(resRedcF2, resRedcF1) } if err := quick.Check(doRedcTest, quickCheckConfig); err != nil { t.Error(err) } } // Ensures correctness of implementation of mul operation which uses MULX func TestMulWithMULX(t *testing.T) { defer resetCpuFeatures() if !HasBMI2 { t.Skip("MULX not supported by the platform") } testMul(t, kUse_MULX, kUse_MUL) } // Ensures correctness of implementation of mul operation which uses MULX and ADOX/ADCX func TestMulWithMULXADxX(t *testing.T) { defer resetCpuFeatures() if !HasADXandBMI2 { t.Skip("MULX, ADCX and ADOX not supported by the platform") } testMul(t, kUse_MULXandADxX, kUse_MUL) } // Ensures correctness of implementation of mul operation which uses MULX and ADOX/ADCX func TestMulWithMULXADxXAgainstMULX(t *testing.T) { defer resetCpuFeatures() if !HasADXandBMI2 { t.Skip("MULX, ADCX and ADOX not supported by the platform") } testMul(t, kUse_MULX, kUse_MULXandADxX) } // Ensures correctness of Montgomery reduction implementation which uses MULX func TestRedcWithMULX(t *testing.T) { defer resetCpuFeatures() if !HasBMI2 { t.Skip("MULX not supported by the platform") } testRedc(t, kUse_MULX, kUse_MUL) } // Ensures correctness of Montgomery reduction implementation which uses MULX // and ADCX/ADOX. func TestRedcWithMULXADxX(t *testing.T) { defer resetCpuFeatures() if !HasADXandBMI2 { t.Skip("MULX, ADCX and ADOX not supported by the platform") } testRedc(t, kUse_MULXandADxX, kUse_MUL) } // Ensures correctness of Montgomery reduction implementation which uses MULX // and ADCX/ADOX. func TestRedcWithMULXADxXAgainstMULX(t *testing.T) { defer resetCpuFeatures() if !HasADXandBMI2 { t.Skip("MULX, ADCX and ADOX not supported by the platform") } testRedc(t, kUse_MULXandADxX, kUse_MULX) } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p503/arith_arm64.s000066400000000000000000000360761343600534300246340ustar00rootroot00000000000000// +build arm64,!noasm #include "textflag.h" TEXT ·fp503ConditionalSwap(SB), NOSPLIT, $0-17 MOVD x+0(FP), R0 MOVD y+8(FP), R1 MOVB choice+16(FP), R2 // Set flags // If choice is not 0 or 1, this implementation will swap completely CMP $0, R2 LDP 0(R0), (R3, R4) LDP 0(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 0(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 0(R1) LDP 16(R0), (R3, R4) LDP 16(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 16(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 16(R1) LDP 32(R0), (R3, R4) LDP 32(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 32(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 32(R1) LDP 48(R0), (R3, R4) LDP 48(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 48(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 48(R1) RET TEXT ·fp503AddReduced(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load first summand into R3-R10 // Add first summand and second summand and store result in R3-R10 LDP 0(R0), (R3, R4) LDP 0(R1), (R11, R12) LDP 16(R0), (R5, R6) LDP 16(R1), (R13, R14) ADDS R11, R3 ADCS R12, R4 ADCS R13, R5 ADCS R14, R6 LDP 32(R0), (R7, R8) LDP 32(R1), (R11, R12) LDP 48(R0), (R9, R10) LDP 48(R1), (R13, R14) ADCS R11, R7 ADCS R12, R8 ADCS R13, R9 ADC R14, R10 // Subtract 2 * p503 in R11-R17 from the result in R3-R10 LDP ·p503x2+0(SB), (R11, R12) LDP ·p503x2+24(SB), (R13, R14) SUBS R11, R3 SBCS R12, R4 LDP ·p503x2+40(SB), (R15, R16) SBCS R12, R5 SBCS R13, R6 MOVD ·p503x2+56(SB), R17 SBCS R14, R7 SBCS R15, R8 SBCS R16, R9 SBCS R17, R10 SBC ZR, ZR, R19 // If x + y - 2 * p503 < 0, R19 is 1 and 2 * p503 should be added AND R19, R11 AND R19, R12 AND R19, R13 AND R19, R14 AND R19, R15 AND R19, R16 AND R19, R17 ADDS R11, R3 ADCS R12, R4 STP (R3, R4), 0(R2) ADCS R12, R5 ADCS R13, R6 STP (R5, R6), 16(R2) ADCS R14, R7 ADCS R15, R8 STP (R7, R8), 32(R2) ADCS R16, R9 ADC R17, R10 STP (R9, R10), 48(R2) RET TEXT ·fp503SubReduced(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load x into R3-R10 // Subtract y from x and store result in R3-R10 LDP 0(R0), (R3, R4) LDP 0(R1), (R11, R12) LDP 16(R0), (R5, R6) LDP 16(R1), (R13, R14) SUBS R11, R3 SBCS R12, R4 SBCS R13, R5 SBCS R14, R6 LDP 32(R0), (R7, R8) LDP 32(R1), (R11, R12) LDP 48(R0), (R9, R10) LDP 48(R1), (R13, R14) SBCS R11, R7 SBCS R12, R8 SBCS R13, R9 SBCS R14, R10 SBC ZR, ZR, R19 // If x - y < 0, R19 is 1 and 2 * p503 should be added LDP ·p503x2+0(SB), (R11, R12) LDP ·p503x2+24(SB), (R13, R14) AND R19, R11 AND R19, R12 LDP ·p503x2+40(SB), (R15, R16) AND R19, R13 AND R19, R14 MOVD ·p503x2+56(SB), R17 AND R19, R15 AND R19, R16 AND R19, R17 ADDS R11, R3 ADCS R12, R4 STP (R3, R4), 0(R2) ADCS R12, R5 ADCS R13, R6 STP (R5, R6), 16(R2) ADCS R14, R7 ADCS R15, R8 STP (R7, R8), 32(R2) ADCS R16, R9 ADC R17, R10 STP (R9, R10), 48(R2) RET TEXT ·fp503AddLazy(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load first summand into R3-R10 // Add first summand and second summand and store result in R3-R10 LDP 0(R0), (R3, R4) LDP 0(R1), (R11, R12) LDP 16(R0), (R5, R6) LDP 16(R1), (R13, R14) ADDS R11, R3 ADCS R12, R4 STP (R3, R4), 0(R2) ADCS R13, R5 ADCS R14, R6 STP (R5, R6), 16(R2) LDP 32(R0), (R7, R8) LDP 32(R1), (R11, R12) LDP 48(R0), (R9, R10) LDP 48(R1), (R13, R14) ADCS R11, R7 ADCS R12, R8 STP (R7, R8), 32(R2) ADCS R13, R9 ADC R14, R10 STP (R9, R10), 48(R2) RET TEXT ·fp503X2AddLazy(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 LDP 0(R0), (R3, R4) LDP 0(R1), (R11, R12) LDP 16(R0), (R5, R6) LDP 16(R1), (R13, R14) ADDS R11, R3 ADCS R12, R4 STP (R3, R4), 0(R2) ADCS R13, R5 ADCS R14, R6 STP (R5, R6), 16(R2) LDP 32(R0), (R7, R8) LDP 32(R1), (R11, R12) LDP 48(R0), (R9, R10) LDP 48(R1), (R13, R14) ADCS R11, R7 ADCS R12, R8 STP (R7, R8), 32(R2) ADCS R13, R9 ADCS R14, R10 STP (R9, R10), 48(R2) LDP 64(R0), (R3, R4) LDP 64(R1), (R11, R12) LDP 80(R0), (R5, R6) LDP 80(R1), (R13, R14) ADCS R11, R3 ADCS R12, R4 STP (R3, R4), 64(R2) ADCS R13, R5 ADCS R14, R6 STP (R5, R6), 80(R2) LDP 96(R0), (R7, R8) LDP 96(R1), (R11, R12) LDP 112(R0), (R9, R10) LDP 112(R1), (R13, R14) ADCS R11, R7 ADCS R12, R8 STP (R7, R8), 96(R2) ADCS R13, R9 ADC R14, R10 STP (R9, R10), 112(R2) RET TEXT ·fp503X2SubLazy(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 LDP 0(R0), (R3, R4) LDP 0(R1), (R11, R12) LDP 16(R0), (R5, R6) LDP 16(R1), (R13, R14) SUBS R11, R3 SBCS R12, R4 STP (R3, R4), 0(R2) SBCS R13, R5 SBCS R14, R6 STP (R5, R6), 16(R2) LDP 32(R0), (R7, R8) LDP 32(R1), (R11, R12) LDP 48(R0), (R9, R10) LDP 48(R1), (R13, R14) SBCS R11, R7 SBCS R12, R8 STP (R7, R8), 32(R2) SBCS R13, R9 SBCS R14, R10 STP (R9, R10), 48(R2) LDP 64(R0), (R3, R4) LDP 64(R1), (R11, R12) LDP 80(R0), (R5, R6) LDP 80(R1), (R13, R14) SBCS R11, R3 SBCS R12, R4 SBCS R13, R5 SBCS R14, R6 LDP 96(R0), (R7, R8) LDP 96(R1), (R11, R12) LDP 112(R0), (R9, R10) LDP 112(R1), (R13, R14) SBCS R11, R7 SBCS R12, R8 SBCS R13, R9 SBCS R14, R10 SBC ZR, ZR, R15 // If x - y < 0, R15 is 1 and p503 should be added LDP ·p503+16(SB), (R16, R17) LDP ·p503+32(SB), (R19, R20) AND R15, R16 AND R15, R17 LDP ·p503+48(SB), (R21, R22) AND R15, R19 AND R15, R20 AND R15, R21 AND R15, R22 ADDS R16, R3 ADCS R16, R4 STP (R3, R4), 64(R2) ADCS R16, R5 ADCS R17, R6 STP (R5, R6), 80(R2) ADCS R19, R7 ADCS R20, R8 STP (R7, R8), 96(R2) ADCS R21, R9 ADC R22, R10 STP (R9, R10), 112(R2) RET // Expects that X0*Y0 is already in Z0(low),Z3(high) and X0*Y1 in Z1(low),Z2(high) // Z0 is not actually touched // Result of (X0-X1) * (Y0-Y1) will be in Z0-Z3 // Inputs get overwritten, except for X1 #define mul128x128comba(X0, X1, Y0, Y1, Z0, Z1, Z2, Z3, T0) \ MUL X1, Y0, X0 \ UMULH X1, Y0, Y0 \ ADDS Z3, Z1 \ ADC ZR, Z2 \ \ MUL Y1, X1, T0 \ UMULH Y1, X1, Y1 \ ADDS X0, Z1 \ ADCS Y0, Z2 \ ADC ZR, ZR, Z3 \ \ ADDS T0, Z2 \ ADC Y1, Z3 // Expects that X points to (X0-X1) // Result of (X0-X3) * (Y0-Y3) will be in Z0-Z7 // Inputs get overwritten, except X2-X3 and Y2-Y3 #define mul256x256karatsuba(X, X0, X1, X2, X3, Y0, Y1, Y2, Y3, Z0, Z1, Z2, Z3, Z4, Z5, Z6, Z7, T0, T1)\ ADDS X2, X0 \ // xH + xL, destroys xL ADCS X3, X1 \ ADCS ZR, ZR, T0 \ \ ADDS Y2, Y0, Z6 \ // yH + yL ADCS Y3, Y1, T1 \ ADC ZR, ZR, Z7 \ \ SUB T0, ZR, Z2 \ SUB Z7, ZR, Z3 \ AND Z7, T0 \ // combined carry \ AND Z2, Z6, Z0 \ // masked(yH + yL) AND Z2, T1, Z1 \ \ AND Z3, X0, Z4 \ // masked(xH + xL) AND Z3, X1, Z5 \ \ MUL Z6, X0, Z2 \ MUL T1, X0, Z3 \ \ ADDS Z4, Z0 \ UMULH T1, X0, Z4 \ ADCS Z5, Z1 \ UMULH Z6, X0, Z5 \ ADC ZR, T0 \ \ // (xH + xL) * (yH + yL) mul128x128comba(X0, X1, Z6, T1, Z2, Z3, Z4, Z5, Z7)\ \ LDP 0+X, (X0, X1) \ \ ADDS Z0, Z4 \ UMULH Y0, X0, Z7 \ UMULH Y1, X0, T1 \ ADCS Z1, Z5 \ MUL Y0, X0, Z0 \ MUL Y1, X0, Z1 \ ADC ZR, T0 \ \ // xL * yL mul128x128comba(X0, X1, Y0, Y1, Z0, Z1, T1, Z7, Z6)\ \ MUL Y2, X2, X0 \ UMULH Y2, X2, Y0 \ SUBS Z0, Z2 \ // (xH + xL) * (yH + yL) - xL * yL SBCS Z1, Z3 \ SBCS T1, Z4 \ MUL Y3, X2, X1 \ UMULH Y3, X2, Z6 \ SBCS Z7, Z5 \ SBCS ZR, T0 \ \ // xH * yH mul128x128comba(X2, X3, Y2, Y3, X0, X1, Z6, Y0, Y1)\ \ SUBS X0, Z2 \ // (xH + xL) * (yH + yL) - xL * yL - xH * yH SBCS X1, Z3 \ SBCS Z6, Z4 \ SBCS Y0, Z5 \ SBCS ZR, T0 \ \ ADDS T1, Z2 \ // (xH * yH) * 2^256 + ((xH + xL) * (yH + yL) - xL * yL - xH * yH) * 2^128 + xL * yL ADCS Z7, Z3 \ ADCS X0, Z4 \ ADCS X1, Z5 \ ADCS T0, Z6 \ ADC Y0, ZR, Z7 // This implements two-level Karatsuba with a 128x128 Comba multiplier // at the bottom TEXT ·fp503Mul(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load xL in R3-R6, xH in R7-R10 // (xH + xL) in R25-R29 LDP 0(R0), (R3, R4) LDP 32(R0), (R7, R8) ADDS R3, R7, R25 ADCS R4, R8, R26 LDP 16(R0), (R5, R6) LDP 48(R0), (R9, R10) ADCS R5, R9, R27 ADCS R6, R10, R29 ADC ZR, ZR, R7 // Load yL in R11-R14, yH in R15-19 // (yH + yL) in R11-R14, destroys yL LDP 0(R1), (R11, R12) LDP 32(R1), (R15, R16) ADDS R15, R11 ADCS R16, R12 LDP 16(R1), (R13, R14) LDP 48(R1), (R17, R19) ADCS R17, R13 ADCS R19, R14 ADC ZR, ZR, R8 // Compute maskes and combined carry SUB R7, ZR, R9 SUB R8, ZR, R10 AND R8, R7 // masked(yH + yL) AND R9, R11, R15 AND R9, R12, R16 AND R9, R13, R17 AND R9, R14, R19 // masked(xH + xL) AND R10, R25, R20 AND R10, R26, R21 AND R10, R27, R22 AND R10, R29, R23 // masked(xH + xL) + masked(yH + yL) in R15-R19 ADDS R20, R15 ADCS R21, R16 ADCS R22, R17 ADCS R23, R19 ADC ZR, R7 // Use z as temporary storage STP (R25, R26), 0(R2) // (xH + xL) * (yH + yL) mul256x256karatsuba(0(R2), R25, R26, R27, R29, R11, R12, R13, R14, R8, R9, R10, R20, R21, R22, R23, R24, R0, R1) MOVD x+8(FP), R0 MOVD y+16(FP), R1 ADDS R21, R15 ADCS R22, R16 ADCS R23, R17 ADCS R24, R19 ADC ZR, R7 // Load yL in R11-R14 LDP 0(R1), (R11, R12) LDP 16(R1), (R13, R14) // xL * yL mul256x256karatsuba(0(R0), R3, R4, R5, R6, R11, R12, R13, R14, R21, R22, R23, R24, R25, R26, R27, R29, R1, R2) MOVD z+0(FP), R2 MOVD y+16(FP), R1 // (xH + xL) * (yH + yL) - xL * yL SUBS R21, R8 SBCS R22, R9 STP (R21, R22), 0(R2) SBCS R23, R10 SBCS R24, R20 STP (R23, R24), 16(R2) SBCS R25, R15 SBCS R26, R16 SBCS R27, R17 SBCS R29, R19 SBC ZR, R7 // Load xH in R3-R6, yH in R11-R14 LDP 32(R0), (R3, R4) LDP 48(R0), (R5, R6) LDP 32(R1), (R11, R12) LDP 48(R1), (R13, R14) ADDS R25, R8 ADCS R26, R9 ADCS R27, R10 ADCS R29, R20 ADC ZR, ZR, R1 MOVD R20, 32(R2) // xH * yH mul256x256karatsuba(32(R0), R3, R4, R5, R6, R11, R12, R13, R14, R21, R22, R23, R24, R25, R26, R27, R29, R2, R20) NEG R1, R1 MOVD z+0(FP), R2 MOVD 32(R2), R20 // (xH + xL) * (yH + yL) - xL * yL - xH * yH in R8-R10,R20,R15-R19 // Store lower half in z, that's done SUBS R21, R8 SBCS R22, R9 STP (R8, R9), 32(R2) SBCS R23, R10 SBCS R24, R20 STP (R10, R20), 48(R2) SBCS R25, R15 SBCS R26, R16 SBCS R27, R17 SBCS R29, R19 SBC ZR, R7 // (xH * yH) * 2^512 + ((xH + xL) * (yH + yL) - xL * yL - xH * yH) * 2^256 + xL * yL // Store remaining limbs in z ADDS $1, R1 ADCS R21, R15 ADCS R22, R16 STP (R15, R16), 64(R2) ADCS R23, R17 ADCS R24, R19 STP (R17, R19), 80(R2) ADCS R7, R25 ADCS ZR, R26 STP (R25, R26), 96(R2) ADCS ZR, R27 ADC ZR, R29 STP (R27, R29), 112(R2) RET // Expects that X0*Y0 is already in Z0(low),Z3(high) and X0*Y1 in Z1(low),Z2(high) // Z0 is not actually touched // Result of (X0-X1) * (Y0-Y3) will be in Z0-Z5 // Inputs remain intact #define mul128x256comba(X0, X1, Y0, Y1, Y2, Y3, Z0, Z1, Z2, Z3, Z4, Z5, T0, T1, T2, T3)\ MUL X1, Y0, T0 \ UMULH X1, Y0, T1 \ ADDS Z3, Z1 \ ADC ZR, Z2 \ \ MUL X0, Y2, T2 \ UMULH X0, Y2, T3 \ ADDS T0, Z1 \ ADCS T1, Z2 \ ADC ZR, ZR, Z3 \ \ MUL X1, Y1, T0 \ UMULH X1, Y1, T1 \ ADDS T2, Z2 \ ADCS T3, Z3 \ ADC ZR, ZR, Z4 \ \ MUL X0, Y3, T2 \ UMULH X0, Y3, T3 \ ADDS T0, Z2 \ ADCS T1, Z3 \ ADC ZR, Z4 \ \ MUL X1, Y2, T0 \ UMULH X1, Y2, T1 \ ADDS T2, Z3 \ ADCS T3, Z4 \ ADC ZR, ZR, Z5 \ \ MUL X1, Y3, T2 \ UMULH X1, Y3, T3 \ ADDS T0, Z3 \ ADCS T1, Z4 \ ADC ZR, Z5 \ ADDS T2, Z4 \ ADC T3, Z5 // This implements the shifted 2^(B*w) Montgomery reduction from // https://eprint.iacr.org/2016/986.pdf, section Section 3.2, with // B = 4, w = 64. Performance results were reported in // https://eprint.iacr.org/2018/700.pdf Section 6. TEXT ·fp503MontgomeryReduce(SB), NOSPLIT, $0-16 MOVD x+8(FP), R0 // Load x0-x1 LDP 0(R0), (R2, R3) // Load the prime constant in R25-R29 LDP ·p503p1s8+32(SB), (R25, R26) LDP ·p503p1s8+48(SB), (R27, R29) // [x0,x1] * p503p1s8 to R4-R9 MUL R2, R25, R4 // x0 * p503p1s8[0] UMULH R2, R25, R7 MUL R2, R26, R5 // x0 * p503p1s8[1] UMULH R2, R26, R6 mul128x256comba(R2, R3, R25, R26, R27, R29, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13) LDP 16(R0), (R3, R11) // x2 LDP 32(R0), (R12, R13) LDP 48(R0), (R14, R15) // Left-shift result in R4-R9 by 56 to R4-R10 ORR R9>>8, ZR, R10 LSL $56, R9 ORR R8>>8, R9 LSL $56, R8 ORR R7>>8, R8 LSL $56, R7 ORR R6>>8, R7 LSL $56, R6 ORR R5>>8, R6 LSL $56, R5 ORR R4>>8, R5 LSL $56, R4 ADDS R4, R11 // x3 ADCS R5, R12 // x4 ADCS R6, R13 ADCS R7, R14 ADCS R8, R15 LDP 64(R0), (R16, R17) LDP 80(R0), (R19, R20) MUL R3, R25, R4 // x2 * p503p1s8[0] UMULH R3, R25, R7 ADCS R9, R16 ADCS R10, R17 ADCS ZR, R19 ADCS ZR, R20 LDP 96(R0), (R21, R22) LDP 112(R0), (R23, R24) MUL R3, R26, R5 // x2 * p503p1s8[1] UMULH R3, R26, R6 ADCS ZR, R21 ADCS ZR, R22 ADCS ZR, R23 ADC ZR, R24 // [x2,x3] * p503p1s8 to R4-R9 mul128x256comba(R3, R11, R25, R26, R27, R29, R4, R5, R6, R7, R8, R9, R10, R0, R1, R2) ORR R9>>8, ZR, R10 LSL $56, R9 ORR R8>>8, R9 LSL $56, R8 ORR R7>>8, R8 LSL $56, R7 ORR R6>>8, R7 LSL $56, R6 ORR R5>>8, R6 LSL $56, R5 ORR R4>>8, R5 LSL $56, R4 ADDS R4, R13 // x5 ADCS R5, R14 // x6 ADCS R6, R15 ADCS R7, R16 MUL R12, R25, R4 // x4 * p503p1s8[0] UMULH R12, R25, R7 ADCS R8, R17 ADCS R9, R19 ADCS R10, R20 ADCS ZR, R21 MUL R12, R26, R5 // x4 * p503p1s8[1] UMULH R12, R26, R6 ADCS ZR, R22 ADCS ZR, R23 ADC ZR, R24 // [x4,x5] * p503p1s8 to R4-R9 mul128x256comba(R12, R13, R25, R26, R27, R29, R4, R5, R6, R7, R8, R9, R10, R0, R1, R2) ORR R9>>8, ZR, R10 LSL $56, R9 ORR R8>>8, R9 LSL $56, R8 ORR R7>>8, R8 LSL $56, R7 ORR R6>>8, R7 LSL $56, R6 ORR R5>>8, R6 LSL $56, R5 ORR R4>>8, R5 LSL $56, R4 ADDS R4, R15 // x7 ADCS R5, R16 // x8 ADCS R6, R17 ADCS R7, R19 MUL R14, R25, R4 // x6 * p503p1s8[0] UMULH R14, R25, R7 ADCS R8, R20 ADCS R9, R21 ADCS R10, R22 MUL R14, R26, R5 // x6 * p503p1s8[1] UMULH R14, R26, R6 ADCS ZR, R23 ADC ZR, R24 // [x6,x7] * p503p1s8 to R4-R9 mul128x256comba(R14, R15, R25, R26, R27, R29, R4, R5, R6, R7, R8, R9, R10, R0, R1, R2) ORR R9>>8, ZR, R10 LSL $56, R9 ORR R8>>8, R9 LSL $56, R8 ORR R7>>8, R8 LSL $56, R7 ORR R6>>8, R7 LSL $56, R6 ORR R5>>8, R6 LSL $56, R5 ORR R4>>8, R5 LSL $56, R4 MOVD z+0(FP), R0 ADDS R4, R17 ADCS R5, R19 STP (R16, R17), 0(R0) // Store final result to z ADCS R6, R20 ADCS R7, R21 STP (R19, R20), 16(R0) ADCS R8, R22 ADCS R9, R23 STP (R21, R22), 32(R0) ADC R10, R24 STP (R23, R24), 48(R0) RET TEXT ·fp503StrongReduce(SB), NOSPLIT, $0-8 MOVD x+0(FP), R0 // Keep x in R1-R8, p503 in R9-R14, subtract to R1-R8 LDP ·p503+16(SB), (R9, R10) LDP 0(R0), (R1, R2) LDP 16(R0), (R3, R4) SUBS R9, R1 SBCS R9, R2 LDP 32(R0), (R5, R6) LDP ·p503+32(SB), (R11, R12) SBCS R9, R3 SBCS R10, R4 LDP 48(R0), (R7, R8) LDP ·p503+48(SB), (R13, R14) SBCS R11, R5 SBCS R12, R6 SBCS R13, R7 SBCS R14, R8 SBC ZR, ZR, R15 // Mask with the borrow and add p503 AND R15, R9 AND R15, R10 AND R15, R11 AND R15, R12 AND R15, R13 AND R15, R14 ADDS R9, R1 ADCS R9, R2 STP (R1, R2), 0(R0) ADCS R9, R3 ADCS R10, R4 STP (R3, R4), 16(R0) ADCS R11, R5 ADCS R12, R6 STP (R5, R6), 32(R0) ADCS R13, R7 ADCS R14, R8 STP (R7, R8), 48(R0) RET golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p503/arith_decl.go000066400000000000000000000023001343600534300247340ustar00rootroot00000000000000// +build amd64,!noasm arm64,!noasm package p503 import ( . "github.com/cloudflare/sidh/internal/isogeny" ) // If choice = 0, leave x,y unchanged. If choice = 1, set x,y = y,x. // If choice is neither 0 nor 1 then behaviour is undefined. // This function executes in constant time. //go:noescape func fp503ConditionalSwap(x, y *FpElement, choice uint8) // Compute z = x + y (mod p). //go:noescape func fp503AddReduced(z, x, y *FpElement) // Compute z = x - y (mod p). //go:noescape func fp503SubReduced(z, x, y *FpElement) // Compute z = x + y, without reducing mod p. //go:noescape func fp503AddLazy(z, x, y *FpElement) // Compute z = x + y, without reducing mod p. //go:noescape func fp503X2AddLazy(z, x, y *FpElementX2) // Compute z = x - y, without reducing mod p. //go:noescape func fp503X2SubLazy(z, x, y *FpElementX2) // Reduce a field element in [0, 2*p) to one in [0,p). //go:noescape func fp503StrongReduce(x *FpElement) // Computes z = x * y. //go:noescape func fp503Mul(z *FpElementX2, x, y *FpElement) // Computes the Montgomery reduction z = x R^{-1} (mod 2*p). On return value // of x may be changed. z=x not allowed. //go:noescape func fp503MontgomeryReduce(z *FpElement, x *FpElementX2) golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p503/arith_generic.go000066400000000000000000000102271343600534300254500ustar00rootroot00000000000000// +build noasm !amd64,!arm64 package p503 import ( . "github.com/cloudflare/sidh/internal/arith" . "github.com/cloudflare/sidh/internal/isogeny" ) // Compute z = x + y (mod p). func fp503AddReduced(z, x, y *FpElement) { var carry uint64 // z=x+y % p503 for i := 0; i < NumWords; i++ { z[i], carry = Addc64(carry, x[i], y[i]) } // z = z - p503x2 carry = 0 for i := 0; i < NumWords; i++ { z[i], carry = Subc64(carry, z[i], p503x2[i]) } // if z<0 add p503x2 back mask := uint64(0 - carry) carry = 0 for i := 0; i < NumWords; i++ { z[i], carry = Addc64(carry, z[i], p503x2[i]&mask) } } // Compute z = x - y (mod p). func fp503SubReduced(z, x, y *FpElement) { var borrow uint64 // z = z - p503x2 for i := 0; i < NumWords; i++ { z[i], borrow = Subc64(borrow, x[i], y[i]) } // if z<0 add p503x2 back mask := uint64(0 - borrow) borrow = 0 for i := 0; i < NumWords; i++ { z[i], borrow = Addc64(borrow, z[i], p503x2[i]&mask) } } // Conditionally swaps bits in x and y in constant time. // mask indicates bits to be swapped (set bits are swapped) // For details see "Hackers Delight, 2.20" // // Implementation doesn't actually depend on a prime field. func fp503ConditionalSwap(x, y *FpElement, mask uint8) { var tmp, mask64 uint64 mask64 = 0 - uint64(mask) for i := 0; i < NumWords; i++ { tmp = mask64 & (x[i] ^ y[i]) x[i] = tmp ^ x[i] y[i] = tmp ^ y[i] } } // Perform Montgomery reduction: set z = x R^{-1} (mod 2*p) // with R=2^512. Destroys the input value. func fp503MontgomeryReduce(z *FpElement, x *FpElementX2) { var carry, t, u, v uint64 var uv Uint128 var count int count = 3 // number of 0 digits in the least significat part of p503 + 1 for i := 0; i < NumWords; i++ { for j := 0; j < i; j++ { if j < (i - count + 1) { uv = Mul64(z[j], p503p1[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } } v, carry = Addc64(0, v, x[i]) u, carry = Addc64(carry, u, 0) t += carry z[i] = v v = u u = t t = 0 } for i := NumWords; i < 2*NumWords-1; i++ { if count > 0 { count-- } for j := i - NumWords + 1; j < NumWords; j++ { if j < (NumWords - count) { uv = Mul64(z[j], p503p1[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } } v, carry = Addc64(0, v, x[i]) u, carry = Addc64(carry, u, 0) t += carry z[i-NumWords] = v v = u u = t t = 0 } v, carry = Addc64(0, v, x[2*NumWords-1]) z[NumWords-1] = v } // Compute z = x * y. func fp503Mul(z *FpElementX2, x, y *FpElement) { var u, v, t uint64 var carry uint64 var uv Uint128 for i := uint64(0); i < NumWords; i++ { for j := uint64(0); j <= i; j++ { uv = Mul64(x[j], y[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } z[i] = v v = u u = t t = 0 } for i := NumWords; i < (2*NumWords)-1; i++ { for j := i - NumWords + 1; j < NumWords; j++ { uv = Mul64(x[j], y[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } z[i] = v v = u u = t t = 0 } z[2*NumWords-1] = v } // Compute z = x + y, without reducing mod p. func fp503AddLazy(z, x, y *FpElement) { var carry uint64 for i := 0; i < NumWords; i++ { z[i], carry = Addc64(carry, x[i], y[i]) } } // Compute z = x + y, without reducing mod p. func fp503X2AddLazy(z, x, y *FpElementX2) { var carry uint64 for i := 0; i < 2*NumWords; i++ { z[i], carry = Addc64(carry, x[i], y[i]) } } // Reduce a field element in [0, 2*p) to one in [0,p). func fp503StrongReduce(x *FpElement) { var borrow, mask uint64 for i := 0; i < NumWords; i++ { x[i], borrow = Subc64(borrow, x[i], p503[i]) } // Sets all bits if borrow = 1 mask = 0 - borrow borrow = 0 for i := 0; i < NumWords; i++ { x[i], borrow = Addc64(borrow, x[i], p503[i]&mask) } } // Compute z = x - y, without reducing mod p. func fp503X2SubLazy(z, x, y *FpElementX2) { var borrow, mask uint64 for i := 0; i < 2*NumWords; i++ { z[i], borrow = Subc64(borrow, x[i], y[i]) } // Sets all bits if borrow = 1 mask = 0 - borrow borrow = 0 for i := NumWords; i < 2*NumWords; i++ { z[i], borrow = Addc64(borrow, z[i], p503[i-NumWords]&mask) } } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p503/arith_test.go000066400000000000000000000206261343600534300250170ustar00rootroot00000000000000package p503 import ( . "github.com/cloudflare/sidh/internal/isogeny" "math/big" "testing" "testing/quick" ) //------------------------------------------------------------------------------ // Extended Field //------------------------------------------------------------------------------ func TestOneFp2ToBytes(t *testing.T) { var x = P503_OneFp2 var xBytes [2 * P503_Bytelen]byte kCurveOps.Fp2ToBytes(xBytes[:], &x) if xBytes[0] != 1 { t.Error("Expected 1, got", xBytes[0]) } for i := 1; i < 2*P503_Bytelen; i++ { if xBytes[i] != 0 { t.Error("Expected 0, got", xBytes[0]) } } } func TestFp2ElementToBytesRoundTrip(t *testing.T) { roundTrips := func(x GeneratedTestParams) bool { var xBytes [2 * P503_Bytelen]byte var xPrime Fp2Element kCurveOps.Fp2ToBytes(xBytes[:], &x.ExtElem) kCurveOps.Fp2FromBytes(&xPrime, xBytes[:]) return VartimeEqFp2(&xPrime, &x.ExtElem) } if err := quick.Check(roundTrips, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementMulDistributesOverAdd(t *testing.T) { mulDistributesOverAdd := func(x, y, z GeneratedTestParams) bool { // Compute t1 = (x+y)*z t1 := new(Fp2Element) kFieldOps.Add(t1, &x.ExtElem, &y.ExtElem) kFieldOps.Mul(t1, t1, &z.ExtElem) // Compute t2 = x*z + y*z t2 := new(Fp2Element) t3 := new(Fp2Element) kFieldOps.Mul(t2, &x.ExtElem, &z.ExtElem) kFieldOps.Mul(t3, &y.ExtElem, &z.ExtElem) kFieldOps.Add(t2, t2, t3) return VartimeEqFp2(t1, t2) } if err := quick.Check(mulDistributesOverAdd, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementMulIsAssociative(t *testing.T) { isAssociative := func(x, y, z GeneratedTestParams) bool { // Compute t1 = (x*y)*z t1 := new(Fp2Element) kFieldOps.Mul(t1, &x.ExtElem, &y.ExtElem) kFieldOps.Mul(t1, t1, &z.ExtElem) // Compute t2 = (y*z)*x t2 := new(Fp2Element) kFieldOps.Mul(t2, &y.ExtElem, &z.ExtElem) kFieldOps.Mul(t2, t2, &x.ExtElem) return VartimeEqFp2(t1, t2) } if err := quick.Check(isAssociative, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementSquareMatchesMul(t *testing.T) { sqrMatchesMul := func(x GeneratedTestParams) bool { // Compute t1 = (x*x) t1 := new(Fp2Element) kFieldOps.Mul(t1, &x.ExtElem, &x.ExtElem) // Compute t2 = x^2 t2 := new(Fp2Element) kFieldOps.Square(t2, &x.ExtElem) return VartimeEqFp2(t1, t2) } if err := quick.Check(sqrMatchesMul, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementInv(t *testing.T) { inverseIsCorrect := func(x GeneratedTestParams) bool { z := new(Fp2Element) kFieldOps.Inv(z, &x.ExtElem) // Now z = (1/x), so (z * x) * x == x kFieldOps.Mul(z, z, &x.ExtElem) kFieldOps.Mul(z, z, &x.ExtElem) return VartimeEqFp2(z, &x.ExtElem) } // This is more expensive; run fewer tests var quickCheckConfig = &quick.Config{MaxCount: (1 << (8 + quickCheckScaleFactor))} if err := quick.Check(inverseIsCorrect, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementBatch3Inv(t *testing.T) { batchInverseIsCorrect := func(x1, x2, x3 GeneratedTestParams) bool { var x1Inv, x2Inv, x3Inv Fp2Element kFieldOps.Inv(&x1Inv, &x1.ExtElem) kFieldOps.Inv(&x2Inv, &x2.ExtElem) kFieldOps.Inv(&x3Inv, &x3.ExtElem) var y1, y2, y3 Fp2Element kCurveOps.Fp2Batch3Inv(&x1.ExtElem, &x2.ExtElem, &x3.ExtElem, &y1, &y2, &y3) return (VartimeEqFp2(&x1Inv, &y1) && VartimeEqFp2(&x2Inv, &y2) && VartimeEqFp2(&x3Inv, &y3)) } // This is more expensive; run fewer tests var quickCheckConfig = &quick.Config{MaxCount: (1 << (5 + quickCheckScaleFactor))} if err := quick.Check(batchInverseIsCorrect, quickCheckConfig); err != nil { t.Error(err) } } //------------------------------------------------------------------------------ // Prime Field //------------------------------------------------------------------------------ func TestPrimeFieldElementMulVersusBigInt(t *testing.T) { mulMatchesBigInt := func(x, y primeFieldElement) bool { z := new(primeFieldElement) z.Mul(&x, &y) check := new(big.Int) check.Mul(toBigInt(&x.A), toBigInt(&y.A)) check.Mod(check, p503BigIntPrime) return check.Cmp(toBigInt(&z.A)) == 0 } if err := quick.Check(mulMatchesBigInt, quickCheckConfig); err != nil { t.Error(err) } } func TestPrimeFieldElementP34VersusBigInt(t *testing.T) { var p34, _ = new(big.Int).SetString("3293960789226779345209813229049836260623046691894590999611415869258960983005190308379728727886506087902151787597521914245745576582754898490288559357951", 10) p34MatchesBigInt := func(x primeFieldElement) bool { z := new(primeFieldElement) z.P34(&x) check := toBigInt(&x.A) check.Exp(check, p34, p503BigIntPrime) return check.Cmp(toBigInt(&z.A)) == 0 } // This is more expensive; run fewer tests var quickCheckConfig = &quick.Config{MaxCount: (1 << (8 + quickCheckScaleFactor))} if err := quick.Check(p34MatchesBigInt, quickCheckConfig); err != nil { t.Error(err) } } func TestPrimeFieldElementToBigInt(t *testing.T) { // Chosen so that p < xR < 2p x := primeFieldElement{A: FpElement{ 1, 1, 1, 1, 1, 1, 1, 36028797018963968, }, } // Computed using Sage: // sage: p = 2^e2 * 3^e3 - 1 // sage: R = 2^512 // sage: from_radix_64 = lambda xs: sum((xi * (2**64)**i for i,xi in enumerate(xs))) // sage: xR = from_radix_64([1]*7 + [2^55]) // sage: assert(p < xR) // sage: assert(xR < 2*p) // sage: (xR / R) % p xBig, _ := new(big.Int).SetString("9018685569593152305590037326062904046918870374552508285127709347526265324701162612011653377441752634975109935373869185819144129719824212073345315986301", 10) if xBig.Cmp(toBigInt(&x.A)) != 0 { t.Error("Expected", xBig, "found", toBigInt(&x.A)) } } func TestFpElementConditionalSwap(t *testing.T) { var one = FpElement{1, 1, 1, 1, 1, 1, 1, 1} var two = FpElement{2, 2, 2, 2, 2, 2, 2, 2} var x = one var y = two fp503ConditionalSwap(&x, &y, 0) if !(x == one && y == two) { t.Error("Found", x, "expected", one) } fp503ConditionalSwap(&x, &y, 1) if !(x == two && y == one) { t.Error("Found", x, "expected", two) } } func BenchmarkFp2ElementMul(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Mul(w, z, z) } } func BenchmarkFp2ElementInv(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Inv(w, z) } } func BenchmarkFp2ElementSquare(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Square(w, z) } } func BenchmarkFp2ElementAdd(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Add(w, z, z) } } func BenchmarkFp2ElementSub(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Sub(w, z, z) } } func BenchmarkPrimeFieldElementMul(b *testing.B) { z := &primeFieldElement{A: bench_x} w := new(primeFieldElement) for n := 0; n < b.N; n++ { w.Mul(z, z) } } // --- field operation functions func BenchmarkFp503Multiply(b *testing.B) { for n := 0; n < b.N; n++ { fp503Mul(&benchmarkFpElementX2, &bench_x, &bench_y) } } func BenchmarkFp503MontgomeryReduce(b *testing.B) { z := bench_z // This benchmark actually computes garbage, because // fp503MontgomeryReduce mangles its input, but since it's // constant-time that shouldn't matter for the benchmarks. for n := 0; n < b.N; n++ { fp503MontgomeryReduce(&benchmarkFpElement, &z) } } func BenchmarkFp503AddReduced(b *testing.B) { for n := 0; n < b.N; n++ { fp503AddReduced(&benchmarkFpElement, &bench_x, &bench_y) } } func BenchmarkFp503SubReduced(b *testing.B) { for n := 0; n < b.N; n++ { fp503SubReduced(&benchmarkFpElement, &bench_x, &bench_y) } } func BenchmarkFp503ConditionalSwap(b *testing.B) { x, y := bench_x, bench_y for n := 0; n < b.N; n++ { fp503ConditionalSwap(&x, &y, 1) fp503ConditionalSwap(&x, &y, 0) } } func BenchmarkFp503StrongReduce(b *testing.B) { x := bench_x for n := 0; n < b.N; n++ { fp503StrongReduce(&x) } } func BenchmarkFp503AddLazy(b *testing.B) { var z FpElement x, y := bench_x, bench_y for n := 0; n < b.N; n++ { fp503AddLazy(&z, &x, &y) } } func BenchmarkFp503X2AddLazy(b *testing.B) { x, y, z := bench_z, bench_z, bench_z for n := 0; n < b.N; n++ { fp503X2AddLazy(&x, &y, &z) } } func BenchmarkFp503X2SubLazy(b *testing.B) { x, y, z := bench_z, bench_z, bench_z for n := 0; n < b.N; n++ { fp503X2SubLazy(&x, &y, &z) } } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p503/consts.go000066400000000000000000000160331343600534300241570ustar00rootroot00000000000000package p503 import ( . "github.com/cloudflare/sidh/internal/isogeny" cpu "github.com/cloudflare/sidh/internal/utils" ) const ( // SIDH public key byte size P503_PublicKeySize = 378 // SIDH shared secret byte size. P503_SharedSecretSize = 126 // Max size of secret key for 2-torsion group, corresponds to 2^e2 - 1 P503_SecretBitLenA = 250 // Size of secret key for 3-torsion group, corresponds to log_2(3^e3) - 1 P503_SecretBitLenB = 252 // Size of a compuatation strategy for 2-torsion group strategySizeA = 124 // Size of a compuatation strategy for 3-torsion group strategySizeB = 158 // ceil(503+7/8) P503_Bytelen = 63 // Number of limbs for a field element NumWords = 8 ) // CPU Capabilities. Those flags are referred by assembly code. According to // https://github.com/golang/go/issues/28230, variables referred from the // assembly must be in the same package. // We declare them variables not constants in order to facilitate testing. var ( // Signals support for MULX which is in BMI2 HasBMI2 = cpu.X86.HasBMI2 // Signals support for ADX and BMI2 HasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX ) // The x-coordinate of PA var P503_affine_PA = Fp2Element{ A: FpElement{ 0xE7EF4AA786D855AF, 0xED5758F03EB34D3B, 0x09AE172535A86AA9, 0x237B9CC07D622723, 0xE3A284CBA4E7932D, 0x27481D9176C5E63F, 0x6A323FF55C6E71BF, 0x002ECC31A6FB8773, }, B: FpElement{ 0x64D02E4E90A620B8, 0xDAB8128537D4B9F1, 0x4BADF77B8A228F98, 0x0F5DBDF9D1FB7D1B, 0xBEC4DB288E1A0DCC, 0xE76A8665E80675DB, 0x6D6F252E12929463, 0x003188BD1463FACC, }, } // The x-coordinate of QA var P503_affine_QA = Fp2Element{ A: FpElement{ 0xB79D41025DE85D56, 0x0B867DA9DF169686, 0x740E5368021C827D, 0x20615D72157BF25C, 0xFF1590013C9B9F5B, 0xC884DCADE8C16CEA, 0xEBD05E53BF724E01, 0x0032FEF8FDA5748C, }, B: FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, }, } // The x-coordinate of RA = PA-QA var P503_affine_RA = Fp2Element{ A: FpElement{ 0x12E2E849AA0A8006, 0x41CF47008635A1E8, 0x9CD720A70798AED7, 0x42A820B42FCF04CF, 0x7BF9BAD32AAE88B1, 0xF619127A54090BBE, 0x1CB10D8F56408EAA, 0x001D6B54C3C0EDEB, }, B: FpElement{ 0x34DB54931CBAAC36, 0x420A18CB8DD5F0C4, 0x32008C1A48C0F44D, 0x3B3BA772B1CFD44D, 0xA74B058FDAF13515, 0x095FC9CA7EEC17B4, 0x448E829D28F120F8, 0x00261EC3ED16A489, }, } // The x-coordinate of PB var P503_affine_PB = Fp2Element{ A: FpElement{ 0x7EDE37F4FA0BC727, 0xF7F8EC5C8598941C, 0xD15519B516B5F5C8, 0xF6D5AC9B87A36282, 0x7B19F105B30E952E, 0x13BD8B2025B4EBEE, 0x7B96D27F4EC579A2, 0x00140850CAB7E5DE, }, B: FpElement{ 0x7764909DAE7B7B2D, 0x578ABB16284911AB, 0x76E2BFD146A6BF4D, 0x4824044B23AA02F0, 0x1105048912A321F3, 0xB8A2E482CF0F10C1, 0x42FF7D0BE2152085, 0x0018E599C5223352, }, } // The x-coordinate of QB var P503_affine_QB = Fp2Element{ A: FpElement{ 0x4256C520FB388820, 0x744FD7C3BAAF0A13, 0x4B6A2DDDB12CBCB8, 0xE46826E27F427DF8, 0xFE4A663CD505A61B, 0xD6B3A1BAF025C695, 0x7C3BB62B8FCC00BD, 0x003AFDDE4A35746C, }, B: FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, }, } // The x-coordinate of RB = PB - QB var P503_affine_RB = Fp2Element{ A: FpElement{ 0x75601CD1E6C0DFCB, 0x1A9007239B58F93E, 0xC1F1BE80C62107AC, 0x7F513B898F29FF08, 0xEA0BEDFF43E1F7B2, 0x2C6D94018CBAE6D0, 0x3A430D31BCD84672, 0x000D26892ECCFE83, }, B: FpElement{ 0x1119D62AEA3007A1, 0xE3702AA4E04BAE1B, 0x9AB96F7D59F990E7, 0xF58440E8B43319C0, 0xAF8134BEE1489775, 0xE7F7774E905192AA, 0xF54AE09308E98039, 0x001EF7A041A86112, }, } // 2-torsion group computation strategy var P503_AliceIsogenyStrategy = [strategySizeA]uint32{ 0x3D, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x1D, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x0D, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x05, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01} // 3-torsion group computation strategy var P503_BobIsogenyStrategy = [strategySizeB]uint32{ 0x47, 0x26, 0x15, 0x0D, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x05, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x11, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x21, 0x11, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01} // Used internally by this package // ------------------------------- var p503 = FpElement{ 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xABFFFFFFFFFFFFFF, 0x13085BDA2211E7A0, 0x1B9BF6C87B7E7DAF, 0x6045C6BDDA77A4D0, 0x004066F541811E1E, } // 2*503 var p503x2 = FpElement{ 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x57FFFFFFFFFFFFFF, 0x2610B7B44423CF41, 0x3737ED90F6FCFB5E, 0xC08B8D7BB4EF49A0, 0x0080CDEA83023C3C, } // p503 + 1 var p503p1 = FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xAC00000000000000, 0x13085BDA2211E7A0, 0x1B9BF6C87B7E7DAF, 0x6045C6BDDA77A4D0, 0x004066F541811E1E, } // R^2=(2^512)^2 mod p var p503R2 = FpElement{ 0x5289A0CF641D011F, 0x9B88257189FED2B9, 0xA3B365D58DC8F17A, 0x5BC57AB6EFF168EC, 0x9E51998BD84D4423, 0xBF8999CBAC3B5695, 0x46E9127BCE14CDB6, 0x003F6CFCE8B81771, } // p503 + 1 left-shifted by 8, assuming little endianness var p503p1s8 = FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x085BDA2211E7A0AC, 0x9BF6C87B7E7DAF13, 0x45C6BDDA77A4D01B, 0x4066F541811E1E60, } // 1*R mod p var P503_OneFp2 = Fp2Element{ A: FpElement{ 0x00000000000003F9, 0x0000000000000000, 0x0000000000000000, 0xB400000000000000, 0x63CB1A6EA6DED2B4, 0x51689D8D667EB37D, 0x8ACD77C71AB24142, 0x0026FBAEC60F5953}, } // 1/2 * R mod p var P503_HalfFp2 = Fp2Element{ A: FpElement{ 0x00000000000001FC, 0x0000000000000000, 0x0000000000000000, 0xB000000000000000, 0x3B69BB2464785D2A, 0x36824A2AF0FE9896, 0xF5899F427A94F309, 0x0033B15203C83BB8}, } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p503/curve_test.go000066400000000000000000000117031343600534300250300ustar00rootroot00000000000000package p503 import ( "bytes" . "github.com/cloudflare/sidh/internal/isogeny" "testing" "testing/quick" ) func TestOne(t *testing.T) { var tmp Fp2Element kFieldOps.Mul(&tmp, &P503_OneFp2, &affine_xP) if !VartimeEqFp2(&tmp, &affine_xP) { t.Error("Not equal 1") } } // This test is here only to ensure that ScalarMult helper works correctly func TestScalarMultVersusSage(t *testing.T) { var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P503_OneFp2} xP = ScalarMult(&curve, &xP, mScalarBytes[:]) // = x([m]P) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(&affine_xaP, affine_xQ) { t.Error("\nExpected\n", affine_xaP, "\nfound\n", affine_xQ) } } func Test_jInvariant(t *testing.T) { var curve = ProjectiveCurveParameters{A: curve_A, C: curve_C} var jbufRes [P503_SharedSecretSize]byte var jbufExp [P503_SharedSecretSize]byte // Computed using Sage // j = 3674553797500778604587777859668542828244523188705960771798425843588160903687122861541242595678107095655647237100722594066610650373491179241544334443939077738732728884873568393760629500307797547379838602108296735640313894560419*i + 3127495302417548295242630557836520229396092255080675419212556702820583041296798857582303163183558315662015469648040494128968509467224910895884358424271180055990446576645240058960358037224785786494172548090318531038910933793845 var known_j = Fp2Element{ A: FpElement{0x2c441d03b72e27c, 0xf2c6748151dbf84, 0x3a774f6191070e, 0xa7c6212c9c800ba6, 0x23921b5cf09abc27, 0x9e1baefbb3cd4265, 0x8cd6a289f12e10dc, 0x3fa364128cf87e}, B: FpElement{0xe7497ac2bf6b0596, 0x629ee01ad23bd039, 0x95ee11587a119fa7, 0x572fb28a24772269, 0x3c00410b6c71567e, 0xe681e83a345f8a34, 0x65d21b1d96bd2d52, 0x7889a47e58901}, } kCurveOps.Jinvariant(&curve, jbufRes[:]) kCurveOps.Fp2ToBytes(jbufExp[:], &known_j) if !bytes.Equal(jbufRes[:], jbufExp[:]) { t.Error("Computed incorrect j-invariant: found\n", jbufRes, "\nexpected\n", jbufExp) } } func TestProjectivePointVartimeEq(t *testing.T) { var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P503_OneFp2} xQ := xP // Scale xQ, which results in the same projective point kFieldOps.Mul(&xQ.X, &xQ.X, &curve_A) kFieldOps.Mul(&xQ.Z, &xQ.Z, &curve_A) if !VartimeEqProjFp2(&xP, &xQ) { t.Error("Expected the scaled point to be equal to the original") } } func TestPointDoubleVersusSage(t *testing.T) { var curve = ProjectiveCurveParameters{A: curve_A, C: curve_C} var params = kCurveOps.CalcCurveParamsEquiv4(&curve) var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P503_OneFp2} kCurveOps.Pow2k(&xP, ¶ms, 1) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xQ, &affine_xP2) { t.Error("\nExpected\n", affine_xP2, "\nfound\n", affine_xQ) } } func TestPointMul4VersusSage(t *testing.T) { var params = kCurveOps.CalcCurveParamsEquiv4(&curve) var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P503_OneFp2} kCurveOps.Pow2k(&xP, ¶ms, 2) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xQ, &affine_xP4) { t.Error("\nExpected\n", affine_xP4, "\nfound\n", affine_xQ) } } func TestPointMul9VersusSage(t *testing.T) { var params = kCurveOps.CalcCurveParamsEquiv3(&curve) var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P503_OneFp2} kCurveOps.Pow3k(&xP, ¶ms, 2) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xQ, &affine_xP9) { t.Error("\nExpected\n", affine_xP9, "\nfound\n", affine_xQ) } } func TestPointPow2kVersusScalarMult(t *testing.T) { var xP, xQ, xR ProjectivePoint var params = kCurveOps.CalcCurveParamsEquiv4(&curve) xP = ProjectivePoint{X: affine_xP, Z: P503_OneFp2} xQ = xP kCurveOps.Pow2k(&xQ, ¶ms, 5) xR = ScalarMult(&curve, &xP, []byte{32}) affine_xQ := xQ.ToAffine(kCurveOps) // = x([32]P) affine_xR := xR.ToAffine(kCurveOps) // = x([32]P) if !VartimeEqFp2(affine_xQ, affine_xR) { t.Error("\nExpected\n", affine_xQ, "\nfound\n", affine_xR) } } func TestPointTripleVersusAddDouble(t *testing.T) { tripleEqualsAddDouble := func(params GeneratedTestParams) bool { var P2, P3, P2plusP ProjectivePoint eqivParams4 := kCurveOps.CalcCurveParamsEquiv4(¶ms.Cparam) eqivParams3 := kCurveOps.CalcCurveParamsEquiv3(¶ms.Cparam) P2 = params.Point P3 = params.Point kCurveOps.Pow2k(&P2, &eqivParams4, 1) // = x([2]P) kCurveOps.Pow3k(&P3, &eqivParams3, 1) // = x([3]P) P2plusP = AddProjFp2(&P2, ¶ms.Point, ¶ms.Point) // = x([2]P + P) return VartimeEqProjFp2(&P3, &P2plusP) } if err := quick.Check(tripleEqualsAddDouble, quickCheckConfig); err != nil { t.Error(err) } } func BenchmarkThreePointLadder255BitScalar(b *testing.B) { var mScalarBytes = [...]uint8{203, 155, 185, 191, 131, 228, 50, 178, 207, 191, 61, 141, 174, 173, 207, 243, 159, 243, 46, 163, 19, 102, 69, 92, 36, 225, 0, 37, 114, 19, 191, 0} for n := 0; n < b.N; n++ { kCurveOps.ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], 255, mScalarBytes[:]) } } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p503/field_ops.go000066400000000000000000000170631343600534300246160ustar00rootroot00000000000000package p503 import ( . "github.com/cloudflare/sidh/internal/isogeny" ) type fp503Ops struct{} func FieldOperations() FieldOps { return &fp503Ops{} } func (fp503Ops) Add(dest, lhs, rhs *Fp2Element) { fp503AddReduced(&dest.A, &lhs.A, &rhs.A) fp503AddReduced(&dest.B, &lhs.B, &rhs.B) } func (fp503Ops) Sub(dest, lhs, rhs *Fp2Element) { fp503SubReduced(&dest.A, &lhs.A, &rhs.A) fp503SubReduced(&dest.B, &lhs.B, &rhs.B) } func (fp503Ops) Mul(dest, lhs, rhs *Fp2Element) { // Let (a,b,c,d) = (lhs.a,lhs.b,rhs.a,rhs.b). a := &lhs.A b := &lhs.B c := &rhs.A d := &rhs.B // We want to compute // // (a + bi)*(c + di) = (a*c - b*d) + (a*d + b*c)i // // Use Karatsuba's trick: note that // // (b - a)*(c - d) = (b*c + a*d) - a*c - b*d // // so (a*d + b*c) = (b-a)*(c-d) + a*c + b*d. var ac, bd FpElementX2 fp503Mul(&ac, a, c) // = a*c*R*R fp503Mul(&bd, b, d) // = b*d*R*R var b_minus_a, c_minus_d FpElement fp503SubReduced(&b_minus_a, b, a) // = (b-a)*R fp503SubReduced(&c_minus_d, c, d) // = (c-d)*R var ad_plus_bc FpElementX2 fp503Mul(&ad_plus_bc, &b_minus_a, &c_minus_d) // = (b-a)*(c-d)*R*R fp503X2AddLazy(&ad_plus_bc, &ad_plus_bc, &ac) // = ((b-a)*(c-d) + a*c)*R*R fp503X2AddLazy(&ad_plus_bc, &ad_plus_bc, &bd) // = ((b-a)*(c-d) + a*c + b*d)*R*R fp503MontgomeryReduce(&dest.B, &ad_plus_bc) // = (a*d + b*c)*R mod p var ac_minus_bd FpElementX2 fp503X2SubLazy(&ac_minus_bd, &ac, &bd) // = (a*c - b*d)*R*R fp503MontgomeryReduce(&dest.A, &ac_minus_bd) // = (a*c - b*d)*R mod p } // Set dest = 1/x // // Allowed to overlap dest with x. // // Returns dest to allow chaining operations. func (fp503Ops) Inv(dest, x *Fp2Element) { a := &x.A b := &x.B // We want to compute // // 1 1 (a - bi) (a - bi) // -------- = -------- -------- = ----------- // (a + bi) (a + bi) (a - bi) (a^2 + b^2) // // Letting c = 1/(a^2 + b^2), this is // // 1/(a+bi) = a*c - b*ci. var asq_plus_bsq primeFieldElement var asq, bsq FpElementX2 fp503Mul(&asq, a, a) // = a*a*R*R fp503Mul(&bsq, b, b) // = b*b*R*R fp503X2AddLazy(&asq, &asq, &bsq) // = (a^2 + b^2)*R*R fp503MontgomeryReduce(&asq_plus_bsq.A, &asq) // = (a^2 + b^2)*R mod p // Now asq_plus_bsq = a^2 + b^2 inv := asq_plus_bsq inv.Mul(&asq_plus_bsq, &asq_plus_bsq) inv.P34(&inv) inv.Mul(&inv, &inv) inv.Mul(&inv, &asq_plus_bsq) var ac FpElementX2 fp503Mul(&ac, a, &inv.A) fp503MontgomeryReduce(&dest.A, &ac) var minus_b FpElement fp503SubReduced(&minus_b, &minus_b, b) var minus_bc FpElementX2 fp503Mul(&minus_bc, &minus_b, &inv.A) fp503MontgomeryReduce(&dest.B, &minus_bc) } func (fp503Ops) Square(dest, x *Fp2Element) { a := &x.A b := &x.B // We want to compute // // (a + bi)*(a + bi) = (a^2 - b^2) + 2abi. var a2, a_plus_b, a_minus_b FpElement fp503AddReduced(&a2, a, a) // = a*R + a*R = 2*a*R fp503AddReduced(&a_plus_b, a, b) // = a*R + b*R = (a+b)*R fp503SubReduced(&a_minus_b, a, b) // = a*R - b*R = (a-b)*R var asq_minus_bsq, ab2 FpElementX2 fp503Mul(&asq_minus_bsq, &a_plus_b, &a_minus_b) // = (a+b)*(a-b)*R*R = (a^2 - b^2)*R*R fp503Mul(&ab2, &a2, b) // = 2*a*b*R*R fp503MontgomeryReduce(&dest.A, &asq_minus_bsq) // = (a^2 - b^2)*R mod p fp503MontgomeryReduce(&dest.B, &ab2) // = 2*a*b*R mod p } // In case choice == 1, performs following swap in constant time: // xPx <-> xQx // xPz <-> xQz // Otherwise returns xPx, xPz, xQx, xQz unchanged func (fp503Ops) CondSwap(xPx, xPz, xQx, xQz *Fp2Element, choice uint8) { fp503ConditionalSwap(&xPx.A, &xQx.A, choice) fp503ConditionalSwap(&xPx.B, &xQx.B, choice) fp503ConditionalSwap(&xPz.A, &xQz.A, choice) fp503ConditionalSwap(&xPz.B, &xQz.B, choice) } // Converts values in x.A and x.B to Montgomery domain // x.A = x.A * R mod p // x.B = x.B * R mod p // Performs v = v*R^2*R^(-1) mod p, for both x.A and x.B func (fp503Ops) ToMontgomery(x *Fp2Element) { var aRR FpElementX2 // convert to montgomery domain fp503Mul(&aRR, &x.A, &p503R2) // = a*R*R fp503MontgomeryReduce(&x.A, &aRR) // = a*R mod p fp503Mul(&aRR, &x.B, &p503R2) fp503MontgomeryReduce(&x.B, &aRR) } // Converts values in x.A and x.B from Montgomery domain // a = x.A mod p // b = x.B mod p // // After returning from the call x is not modified. func (fp503Ops) FromMontgomery(x *Fp2Element, out *Fp2Element) { var aR FpElementX2 // convert from montgomery domain // TODO: make fpXXXMontgomeryReduce use stack instead of reusing aR // so that we don't have do this copy here copy(aR[:], x.A[:]) fp503MontgomeryReduce(&out.A, &aR) // = a mod p in [0, 2p) fp503StrongReduce(&out.A) // = a mod p in [0, p) for i := range aR { aR[i] = 0 } copy(aR[:], x.B[:]) fp503MontgomeryReduce(&out.B, &aR) fp503StrongReduce(&out.B) } //------------------------------------------------------------------------------ // Prime Field //------------------------------------------------------------------------------ // Represents an element of the prime field F_p. type primeFieldElement struct { // This field element is in Montgomery form, so that the value `A` is // represented by `aR mod p`. A FpElement } // Set dest = lhs * rhs. // // Allowed to overlap lhs or rhs with dest. // // Returns dest to allow chaining operations. func (dest *primeFieldElement) Mul(lhs, rhs *primeFieldElement) *primeFieldElement { a := &lhs.A // = a*R b := &rhs.A // = b*R var ab FpElementX2 fp503Mul(&ab, a, b) // = a*b*R*R fp503MontgomeryReduce(&dest.A, &ab) // = a*b*R mod p return dest } // Set dest = x^(2^k), for k >= 1, by repeated squarings. // // Allowed to overlap x with dest. // // Returns dest to allow chaining operations. func (dest *primeFieldElement) Pow2k(x *primeFieldElement, k uint8) *primeFieldElement { dest.Mul(x, x) for i := uint8(1); i < k; i++ { dest.Mul(dest, dest) } return dest } // Set dest = x^((p-3)/4). If x is square, this is 1/sqrt(x). // Uses variation of sliding-window algorithm from with window size // of 5 and least to most significant bit sliding (left-to-right) // See HAC 14.85 for general description. // // Allowed to overlap x with dest. // // Returns dest to allow chaining operations. func (dest *primeFieldElement) P34(x *primeFieldElement) *primeFieldElement { // Sliding-window strategy computed with etc/scripts/sliding_window_strat_calc.py // // This performs sum(powStrategy) + 1 squarings and len(lookup) + len(mulStrategy) // multiplications. powStrategy := []uint8{1, 12, 5, 5, 2, 7, 11, 3, 8, 4, 11, 4, 7, 5, 6, 3, 7, 5, 7, 2, 12, 5, 6, 4, 6, 8, 6, 4, 7, 5, 5, 8, 5, 8, 5, 5, 8, 9, 3, 6, 2, 10, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3} mulStrategy := []uint8{0, 12, 11, 10, 0, 1, 8, 3, 7, 1, 8, 3, 6, 7, 14, 2, 14, 14, 9, 0, 13, 9, 15, 5, 12, 7, 13, 7, 15, 6, 7, 9, 0, 5, 7, 6, 8, 8, 3, 7, 0, 10, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3} // Precompute lookup table of odd multiples of x for window // size k=5. lookup := [16]primeFieldElement{} xx := &primeFieldElement{} xx.Mul(x, x) lookup[0] = *x for i := 1; i < 16; i++ { lookup[i].Mul(&lookup[i-1], xx) } // Now lookup = {x, x^3, x^5, ... } // so that lookup[i] = x^{2*i + 1} // so that lookup[k/2] = x^k, for odd k *dest = lookup[mulStrategy[0]] for i := uint8(1); i < uint8(len(powStrategy)); i++ { dest.Pow2k(dest, powStrategy[i]) dest.Mul(dest, &lookup[mulStrategy[i]]) } return dest } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p503/isogeny_test.go000066400000000000000000000132271343600534300253640ustar00rootroot00000000000000package p503 import ( . "github.com/cloudflare/sidh/internal/isogeny" "testing" ) func TestFourIsogenyVersusSage(t *testing.T) { var xR, xP4, resPhiXr, expPhiXr ProjectivePoint var phi = Newisogeny4(kFieldOps) // Given 4-torsion point on E, constructs a four-isogeny phi. Then evaluates // point xR on the isogeny and compares with expected result. // Values generated with reference implementation. xP4 = ProjectivePoint{ X: Fp2Element{ A: FpElement{0xD00E20EC32B0EC29, 0xB931E12F6B486A34, 0x96EFFCAEC541E83F, 0x415729120E95D243, 0xB15DADFFBC7986EB, 0x27E7697979D482AC, 0xB269E255C3C11421, 0x35DFF53EF1BDE4}, B: FpElement{0x691F8D69E98BBF40, 0xAB3894C2F436C73, 0x6CE884D45D785C50, 0xBCDE642D761476C0, 0x8023EF2FCF4C9506, 0x6E3914CFCA94C8A0, 0x8AFE4F1C54EB8744, 0x163227D8890C30}, }, Z: Fp2Element{ A: FpElement{0x38B48A08355253FD, 0x457A001F6F522A58, 0x1959F48231C94070, 0xDF3B4C55A3FF1202, 0x3835E8FB47E9B93F, 0x84320E41E65889B5, 0x6D4AA6D38651BE7E, 0xF50448746FF64}, B: FpElement{0xEBBCCCBB347E448C, 0xFBC721B5DB2103C9, 0x54FD31DF0C538F18, 0xDE7B3C6CBB60C5BD, 0x86B664DCF5F4B272, 0x705CFC301B13DCD6, 0xFD250579C9257778, 0x366F73666C6C92}, }, } xR = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x6F50E690932A1473, 0x3EC8EE10B576C790, 0x5CABB067D0648B46, 0x77EA840A4219753C, 0xBFEE6EAB2073A69A, 0x845637223AB3687B, 0x20294B44CBDC9F34, 0x59C58391A33D5C}, B: FpElement{0x68832275EA18BDDC, 0x90039FCD522B6CCF, 0x43A97285E71B711A, 0xBCBFC2C3BCCF6135, 0xDE13C2E410DCF1FE, 0xB9B1243C7E4FC515, 0x3CE1C024813A61D, 0x2BED536959B2D}, }, Z: Fp2Element{ A: FpElement{0x99C27A12675FD4CD, 0x856E300D657ADDE3, 0x156C170BB8983CD3, 0x6A366F8BA2FD7805, 0xE922609C4B80E4A4, 0xAC5A1D2EBE7F2A9A, 0x2E732DAF59AE4A03, 0x6AC91B99882D54}, B: FpElement{0x909A822C8536612D, 0xBF579BF499C34C2D, 0xE2FAD61D94E1E60F, 0x37CB4E1F0A819D5F, 0xDBD36EA4FC053430, 0x28F3805ECA4730D8, 0x33F47EAF9ED8CEA2, 0x24FC2437192954}, }, } expPhiXr = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x2E2D7C96BB057AE9, 0x58FF5432A90EA157, 0x6EED2543FED809C7, 0xF721E3657B17C6D3, 0xC9F8EBED3E1430AF, 0xA94DAFEC2ED7275A, 0xFC8A869CF993A64D, 0x45C8B4291BC602}, B: FpElement{0xD5730CA5DA535196, 0x958D80511DCD695F, 0xCFDCAA016F0D6AF, 0x176FAA4414FC230B, 0x61A5CDD045B67365, 0x13AC43A5E7F0E446, 0x7BCABE9E555C2729, 0x2CA6A01B26BFEB}, }, Z: Fp2Element{ A: FpElement{0x684A5999FCD11607, 0x3D0057EA6B62FC92, 0x692895B2D37F8EAA, 0xF0BB08106CCF7FDF, 0x3A521D25A431C5CF, 0x8F8DCB43E0BD2475, 0x9CF6266E32D712D3, 0x3B98B6D5C0B377}, B: FpElement{0x8F4E4EA61ACA375, 0xE8DF168DA6349D03, 0x8DFD68ABA4AB08CC, 0x5352A227C5C6D59C, 0x45750EB03218D4D6, 0x71E2AD1F130DB05E, 0x64F35BBA642804EC, 0x26542493BF5F1C}, }, } phi.GenerateCurve(&xP4) resPhiXr = phi.EvaluatePoint(&xR) if !VartimeEqProjFp2(&expPhiXr, &resPhiXr) { t.Error("\nExpected\n", expPhiXr.ToAffine(kCurveOps), "\nfound\n", resPhiXr.ToAffine(kCurveOps)) } } func TestThreeIsogenyVersusSage(t *testing.T) { var xR, xP3, resPhiXr, expPhiXr ProjectivePoint var phi = Newisogeny3(kFieldOps) // Given 3-torsion point on E, constructs a three-isogeny phi. Then evaluates // point xR on the isogeny and compares with expected result. // Values generated with reference implementation. xP3 = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x43C64B1158DE7ED, 0xC522F8AB7DCC9247, 0xC5BFCC8EA95E9F4D, 0xA6DFCE67C53F63BC, 0x9C6329D65EBBBE44, 0x91949F2E9864BD5A, 0xC9AE7B8B0435B0AF, 0x1607E735F9E10}, B: FpElement{0x3EEFA1A8B5D59CD9, 0x1ED7264A82282E14, 0x253309D0531054E1, 0x7557CC9966B63AB1, 0xAAB3B77A0CF3D9C, 0xF9BE0DC1977358F4, 0xC5B7AE198CF22874, 0x3250464B34AAD1}, }, Z: Fp2Element{ A: FpElement{0xC06D37BCBBD98418, 0x1C7C9E348A880023, 0xB1F61CA46EA815FD, 0x7E0E5F01EAB9D7B6, 0xE8737A5EF457E188, 0xBD228FDA0BAF18D8, 0xAB7823AF7BAFD785, 0x2BCA7CCFFC1DDA}, B: FpElement{0xBC34D39B7CBF3EDC, 0x882C3AFC4011C8E8, 0x68A2D74B0FBA196E, 0x810E59E7DD937844, 0xE796B5D4BFC3982F, 0xC7D23388B8E91883, 0x552B783D3986109F, 0x1337962318DFC0}, }, } xR = ProjectivePoint{ X: Fp2Element{ A: FpElement{0xBA300F2F1C010480, 0xE196ACEE08FEA8BA, 0xC1B8AB47C5D6D9A, 0x2CDFF1E375E5FAFC, 0x2D55CBA6472829AF, 0xE03ECA628015CA0E, 0xD1055B779C2DCC6C, 0x7F915F81CAF33}, B: FpElement{0x5179F86B4F63CA45, 0x8CF33AD2D0D7E409, 0xE9065B70EB5F8680, 0xFBA717809FF35FE, 0x8E31E6EF3CAD154C, 0x65907A2B38A0B673, 0x9E5A4FFCF1F7E74, 0x3170F0C18D5F96}, }, Z: Fp2Element{ A: FpElement{0x1F48F3A2DFB1C73B, 0x3E35C8CD0752F9A4, 0x88601205D0B6B8C0, 0xCFF48E40A9C200CD, 0x10E6964543C6195C, 0x6B8F141796914E13, 0xA7B5F96629DF495E, 0x6600DB36C90874}, B: FpElement{0xAB54D5B8247FE6CA, 0xD5EE5EAE7C19E9B4, 0x16CB352BA75CB7EF, 0x6D651A77FEB51C5E, 0x2D72F65AC9D39E8A, 0xE10F942CEAD9C7EA, 0x36A5A27BE681CE7A, 0x1C500AA0D9A62F}, }, } expPhiXr = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x61B04752330F7FFF, 0x67F7FADAE5093E06, 0xB665F1E8F70118C6, 0x4F529F9BB30AE6A0, 0xD38E0FC09717C6D1, 0xB7886970ADE8584B, 0x73D66E118BAA193C, 0x4604C634755CFB}, B: FpElement{0x65CCBE0938AB5A99, 0x1F23B14E1548E3BC, 0x2A565624008051D8, 0xC45D118553BEA2E5, 0x7E2C027737E386EA, 0xF8EC1668C4C09CFB, 0x24CBE8F9D424021D, 0x62E99144A24A6}, }, Z: Fp2Element{ A: FpElement{0x71D9A198BB845CCA, 0xB2D0A8D2168F4399, 0x9C85368AF08AC7E1, 0x76D71A16B7F4B966, 0x60821CCED03DE7DB, 0x80D404686B651216, 0x8489AF1E2E14BF8E, 0x370781CDE810FE}, B: FpElement{0xB12EE10B6B80F65B, 0xC4C1CD99C671118D, 0xB84A2C8B2C153F37, 0x9170BAE0CE11B7A8, 0xF38DE8F9AF1BF991, 0x88612A07E7F7015A, 0x9611B2C68B94BC68, 0x5BCFB00EC5DE0}, }, } phi.GenerateCurve(&xR) resPhiXr = phi.EvaluatePoint(&xP3) if !VartimeEqProjFp2(&expPhiXr, &resPhiXr) { t.Error("\nExpected\n", expPhiXr.ToAffine(kCurveOps), "\nfound\n", resPhiXr.ToAffine(kCurveOps)) } } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p503/utils_test.go000066400000000000000000000372351343600534300250540ustar00rootroot00000000000000package p503 // Tools used for testing and debugging import ( . "github.com/cloudflare/sidh/internal/isogeny" "math/big" "math/rand" "reflect" "testing/quick" ) /* ------------------------------------------------------------------------- Underlying field configuration -------------------------------------------------------------------------*/ var ( kFieldOps = FieldOperations() kParams = &SidhParams{ Op: kFieldOps, OneFp2: P503_OneFp2, HalfFp2: P503_HalfFp2, Bytelen: P503_Bytelen, } kCurveOps = &CurveOperations{Params: kParams} ) /* ------------------------------------------------------------------------- Configure testing/quick -------------------------------------------------------------------------*/ var ( quickCheckScaleFactor = uint8(3) quickCheckConfig = &quick.Config{MaxCount: (1 << (12 + quickCheckScaleFactor))} ) /* ------------------------------------------------------------------------- Structure used by tests -------------------------------------------------------------------------*/ type GeneratedTestParams struct { Point ProjectivePoint Cparam ProjectiveCurveParameters ExtElem Fp2Element } // A = 8752234765512331234913716743014562460822083005386252003333602919474238975785850965349950219277942402920758585086620525443539725921333735154674119646075*i + 6339624979889725406021454983012408976766782818694212228554611573314701271183857175866122275755278397694585249002282183018114967373119429936587424396917 var curve_A = Fp2Element{ A: FpElement{0xd9816986a543095f, 0xa78cb1d7217bec21, 0x9595dc97b74ea70, 0x9120a1da6b42797d, 0x59ef9d903f74e47c, 0x4c58a4cdc45b6d0b, 0x816d5213aaf7ee6d, 0x3892fee6bb7343}, B: FpElement{0x28c5288acbedf11b, 0x2143a438c86f6c68, 0x7cb5c4ae9c4c8e34, 0xb478aea445eed48b, 0x24d5c175776db478, 0x234582f8676c0ebe, 0x56234267b625fb08, 0x2c6e58d84b1192}} // C = 10458464853790890798085664692909194316288127038910691163573355876336993883402795907795767791362493831987298578966325154262747805705783782806176495638177*i + 7770984753616185271325854825309278833018655051139367603077592443785629339985729818288672809062782315510526648882226172896710704020683893684611137718845 var curve_C = Fp2Element{ A: FpElement{0xe05948236f2f913b, 0xc45da9ad1219a255, 0x7a568972a32fc1d0, 0x30f00bdd7071c3b1, 0x3b761b8dac2c98bc, 0x760f21b2179737b6, 0x13217e6656a13476, 0x2606b798e685aa}, B: FpElement{0x1c0171f78820052e, 0x440b7f7087e57140, 0xe0510c07b31b0e96, 0xd0cf489b2ac4aea9, 0x4fb328f1c1fdf783, 0xb3b4912342951cb7, 0x70a4b64e81961c42, 0x33eed63cf07181}} // x(P) = 9720237205826983370867050298878715935679372786589878620121159082290288918688002583435964840822877971257659901481591644347943354235932355923042390796255*i + 634577413124118560098123299804750904956499531431297942628887930019161512075536652691244843248133437326050395005054997679717801535474938466995392156605 var affine_xP = Fp2Element{ A: FpElement{0xb606d954d407faf2, 0x58a1ef6cd213a203, 0x9823b55033e62f7b, 0x59cafc060d5e25a1, 0x529685f1753526fc, 0xc2eac3d219989c7d, 0xc5e30c75dfd343a0, 0x378285adc968a0}, B: FpElement{0x6670f36db977b9da, 0xa07e2fdda5e1a7f0, 0xf367a7a722aed87d, 0x6c269e06d595cd10, 0x8379aa6092d87700, 0x57276ce3557ee7ae, 0xac8107bfbcd28993, 0x3d6f98869617a7}} // x(Q) = 613162677562606602867371958793876971530136728660199185642812914351735322828980793298955764087721218995329689800176835576008483782305021671417330230966*i + 12939479853552958669415184882894789433224467828463058020095712989798268661016843892597050485554155971441665589419365957826417334087966365414056706471602 var affine_xQ = Fp2Element{ A: FpElement{0xd3d14533cb0db45c, 0xdaf10b9f5fb037cf, 0x9562c31985823562, 0xb79b75e2bf5635a5, 0x83d38fb1669c2d9, 0x5e67117a35a57cbd, 0x4b94ed6c3cbf54a4, 0x3f47706b62778d}, B: FpElement{0x1c766c0e7ed612d6, 0x2f3b42979e8efd86, 0xd82bac0006415ee7, 0x20cfe3bec0970042, 0x8f6628807e862bf9, 0xac4f82d13fddd9c5, 0x70b756e4bac1fa85, 0x350c02508e50dc}} var affine_xPmQ = Fp2Element{ A: FpElement{0x7295ac0e8a5531c8, 0xc02afbef6cdf51a8, 0x84d0c1bb8d80624f, 0x26abbf06c61e814b, 0xada277883fbdae07, 0x63b6739db68df3a7, 0x3554670381bcfcc6, 0x33419be255bbc6}, B: FpElement{0xff9df35102da997a, 0xf9b920b2d8bd6210, 0x43d1514920e73bfb, 0x624c6fd6ef16da74, 0xeb535968ed0d1286, 0x9243e6ce29a636e6, 0x1849ed96cb7940e0, 0x1e4b495933b675}} var affine_xP2 = Fp2Element{ A: FpElement{0x4e1133c2b3855902, 0x875a775c67597fbb, 0xd17eb74254141abb, 0x1d5a464a4f3391f5, 0x24405c332811d007, 0x7e47e3eb489a7372, 0x65b130dfd9efe605, 0xfa69fac179803}, B: FpElement{0x329f5322e1be51ee, 0x9004dca8132ebd6f, 0x7cd87e447ca8a7b6, 0x10a6ec02c38ce69e, 0x8cef2ed7d112ac46, 0x5f385a9fc4b57cd7, 0x68a366354fe7a32e, 0x2223c1455486ac}} var affine_xP3 = Fp2Element{ A: FpElement{0x74a2894cccbe287d, 0xa50e3ec842e13fce, 0xd42ea4d3f1b7ad0b, 0xa4943d50d306f99e, 0xf83e9c0955b08c33, 0xffd8e313402b9380, 0x967b315db0b2e6e, 0x3a0945883df3b4}, B: FpElement{0xa9f610420a81c5ba, 0xbeb84b3ded2b4e75, 0x9fd6cea494470a70, 0x2fb0075e71900b0e, 0x63a0beb6abf3ca3d, 0xeb3e171798959f2e, 0x2209801eb702d40e, 0x36f8c4603e0fdb}} var affine_xP4 = Fp2Element{ A: FpElement{0x4eb695d34b46be8f, 0xfb5e76c58585f2d2, 0xa41f8aafa6dbb531, 0x4db82f5db5cfd144, 0x14dab0e3200cbba0, 0x430381706a279f81, 0xdf6707a57161f81, 0x44740f17197c3}, B: FpElement{0xa2473705cdb6d4e9, 0xfa3cd67b9c15502c, 0xf0928166d0c5cee1, 0x6150aba0c874faaa, 0x6c0b18d6d92f9034, 0xcff71d340fc1e72e, 0x19a47027af917587, 0x25ed4bad443b8f}} var affine_xP9 = Fp2Element{ A: FpElement{0x112da30e288217e0, 0x5b336d527320a5f7, 0xbbf4d9403b68e3c6, 0x55eccb31c40b359c, 0x8907129ab69b3203, 0x69cc8c750125a915, 0xa41a38e6f530c0e1, 0xbe68e23af1b8d}, B: FpElement{0x472c603765964213, 0xe4e64995b0769754, 0x4515583c74a6dd24, 0xff7c57f5818363a2, 0xbeaeb24662a92177, 0x8a54fa61fbf24c68, 0xa85542049eb45e12, 0x2b54caf655e285}} // m = 3904534670189250445536401319770569077681088033069864532895 var mScalarBytes = [...]uint8{0x9f, 0x3b, 0xe7, 0xf9, 0xf4, 0x7c, 0xe6, 0xce, 0x79, 0x3e, 0x3d, 0x9f, 0x9f, 0x3b, 0xe7, 0xf9, 0xf4, 0x7c, 0xe6, 0xce, 0x79, 0x3e, 0x3d, 0x9f} var affine_xaP = Fp2Element{ A: FpElement{0x100a82c2be58e28b, 0x70ee7b57f40d9103, 0xb9f21d6327411cbb, 0x976b2a65166591cb, 0x35435bd4614ca404, 0x15f862a9c6f51469, 0x14d9ccfe634f374a, 0x31234988b0766c}, B: FpElement{0x323a3a13113b35f8, 0xc949dad174586c8f, 0x1c5ed3b1263143c, 0x13ba9870c9b5bab8, 0x79fb89a31cfe7f19, 0xa8af6d4b5d947ed2, 0xcff00f80d7b67a56, 0xfdfcb136bff75}} // Inputs for testing 3-point-ladder var threePointLadderInputs = []ProjectivePoint{ // x(P) ProjectivePoint{ X: Fp2Element{ A: FpElement{0x43941FA9244C059E, 0xD1F337D076941189, 0x6B6A8B3A8763C96A, 0x6DF569708D6C9482, 0x487EE5707A52F4AA, 0xDE396F6E2559689E, 0xE5EE3895A8991469, 0x2B0946695790A8}, B: FpElement{0xAB552C0FDAED092E, 0x7DF895E43E7DCB1C, 0x35C700E761920C4B, 0xCC5807DD70DC117A, 0x0884039A5A8DB18A, 0xD04620B3D0738052, 0xA200835605138F10, 0x3FF2E59B2FDC6A}}, Z: P503_OneFp2, }, // x(Q) ProjectivePoint{ X: Fp2Element{ A: FpElement{0x77015826982BA1FD, 0x44024489673471E4, 0x1CAA2A5F4D5DA63B, 0xA183C07E50738C01, 0x8B97782D4E1A0DE6, 0x9B819522FBC38280, 0x0BDA46A937FB7B8A, 0x3B3614305914DF}, B: FpElement{0xBF0366E97B3168D9, 0xAA522AC3879CEF0F, 0x0AF5EC975BD035C8, 0x1F26FEE7BBAC165C, 0xA0EE6A637724A6AB, 0xFB52101E36BA3A38, 0xD29CF5E376E17376, 0x1374A50DF57071}}, Z: P503_OneFp2, }, // x(P-Q) ProjectivePoint{ X: Fp2Element{ A: FpElement{0xD99279BBD41EA559, 0x35CF18E72F578214, 0x90473B1DC77F73E8, 0xBFFEA930B25D7F66, 0xFD558EA177B900B2, 0x7CFAD273A782A23E, 0x6B1F610822E0F611, 0x26D2D2EF9619B5}, B: FpElement{0x534F83651CBCC75D, 0x591FB4757AED5D08, 0x0B04353D40BED542, 0x829A94703AAC9139, 0x0F9C2E6D7663EB5B, 0x5D2D0F90C283F746, 0x34C872AA12A7676E, 0x0ECDB605FBFA16}}, Z: P503_OneFp2, }, } var curve = ProjectiveCurveParameters{A: curve_A, C: curve_C} // prime p503 var p503BigIntPrime, _ = new(big.Int).SetString("13175843156907117380839252916199345042492186767578363998445663477035843932020761233518914911546024351608607150390087656982982306331019593961154237431807", 10) /* ------------------------------------------------------------------------- Values used by benchmarking tools -------------------------------------------------------------------------*/ // Package-level storage for this field element is intended to deter // compiler optimizations. var ( benchmarkFpElement FpElement benchmarkFpElementX2 FpElementX2 bench_x = FpElement{17026702066521327207, 5108203422050077993, 10225396685796065916, 11153620995215874678, 6531160855165088358, 15302925148404145445, 1248821577836769963, 9789766903037985294, 7493111552032041328, 10838999828319306046, 18103257655515297935, 27403304611634} bench_y = FpElement{4227467157325093378, 10699492810770426363, 13500940151395637365, 12966403950118934952, 16517692605450415877, 13647111148905630666, 14223628886152717087, 7167843152346903316, 15855377759596736571, 4300673881383687338, 6635288001920617779, 30486099554235} bench_z = FpElementX2{1595347748594595712, 10854920567160033970, 16877102267020034574, 12435724995376660096, 3757940912203224231, 8251999420280413600, 3648859773438820227, 17622716832674727914, 11029567000887241528, 11216190007549447055, 17606662790980286987, 4720707159513626555, 12887743598335030915, 14954645239176589309, 14178817688915225254, 1191346797768989683, 12629157932334713723, 6348851952904485603, 16444232588597434895, 7809979927681678066, 14642637672942531613, 3092657597757640067, 10160361564485285723, 240071237} ) /* ------------------------------------------------------------------------- Helpers -------------------------------------------------------------------------*/ // Given xP = x(P), xQ = x(Q), and xPmQ = x(P-Q), compute xR = x(P+Q). // // Returns xR to allow chaining. Safe to overlap xP, xQ, xR. func AddProjFp2(xP, xQ, xPmQ *ProjectivePoint) ProjectivePoint { // Algorithm 1 of Costello-Smith. var v0, v1, v2, v3, v4 Fp2Element var xR ProjectivePoint kFieldOps.Add(&v0, &xP.X, &xP.Z) // X_P + Z_P kFieldOps.Sub(&v1, &xQ.X, &xQ.Z) kFieldOps.Mul(&v1, &v1, &v0) // (X_Q - Z_Q)(X_P + Z_P) kFieldOps.Sub(&v0, &xP.X, &xP.Z) // X_P - Z_P kFieldOps.Add(&v2, &xQ.X, &xQ.Z) kFieldOps.Mul(&v2, &v2, &v0) // (X_Q + Z_Q)(X_P - Z_P) kFieldOps.Add(&v3, &v1, &v2) kFieldOps.Square(&v3, &v3) // 4(X_Q X_P - Z_Q Z_P)^2 kFieldOps.Sub(&v4, &v1, &v2) kFieldOps.Square(&v4, &v4) // 4(X_Q Z_P - Z_Q X_P)^2 kFieldOps.Mul(&v0, &xPmQ.Z, &v3) // 4X_{P-Q}(X_Q X_P - Z_Q Z_P)^2 kFieldOps.Mul(&xR.Z, &xPmQ.X, &v4) // 4Z_{P-Q}(X_Q Z_P - Z_Q X_P)^2 xR.X = v0 return xR } // Given xP = x(P) and cached curve parameters Aplus2C = A + 2*C, C4 = 4*C, // compute xQ = x([2]P). // // Returns xQ to allow chaining. Safe to overlap xP, xQ. func DoubleProjFp2(xP *ProjectivePoint, Aplus2C, C4 *Fp2Element) ProjectivePoint { // Algorithm 2 of Costello-Smith, amended to work with projective curve coefficients. var v1, v2, v3, xz4 Fp2Element var xQ ProjectivePoint kFieldOps.Add(&v1, &xP.X, &xP.Z) // (X+Z)^2 kFieldOps.Square(&v1, &v1) kFieldOps.Sub(&v2, &xP.X, &xP.Z) // (X-Z)^2 kFieldOps.Square(&v2, &v2) kFieldOps.Sub(&xz4, &v1, &v2) // 4XZ = (X+Z)^2 - (X-Z)^2 kFieldOps.Mul(&v2, &v2, C4) // 4C(X-Z)^2 kFieldOps.Mul(&xQ.X, &v1, &v2) // 4C(X+Z)^2(X-Z)^2 kFieldOps.Mul(&v3, &xz4, Aplus2C) // 4XZ(A + 2C) kFieldOps.Add(&v3, &v3, &v2) // 4XZ(A + 2C) + 4C(X-Z)^2 kFieldOps.Mul(&xQ.Z, &v3, &xz4) // (4XZ(A + 2C) + 4C(X-Z)^2)4XZ // Now (xQ.x : xQ.z) // = (4C(X+Z)^2(X-Z)^2 : (4XZ(A + 2C) + 4C(X-Z)^2)4XZ ) // = ((X+Z)^2(X-Z)^2 : (4XZ((A + 2C)/4C) + (X-Z)^2)4XZ ) // = ((X+Z)^2(X-Z)^2 : (4XZ((a + 2)/4) + (X-Z)^2)4XZ ) return xQ } // Given x(P) and a scalar m in little-endian bytes, compute x([m]P) using the // Montgomery ladder. This is described in Algorithm 8 of Costello-Smith. // // This function's execution time is dependent only on the byte-length of the // input scalar. All scalars of the same input length execute in uniform time. // The scalar can be padded with zero bytes to ensure a uniform length. // // Safe to overlap the source with the destination. func ScalarMult(curve *ProjectiveCurveParameters, xP *ProjectivePoint, scalar []uint8) ProjectivePoint { var x0, x1, tmp ProjectivePoint var Aplus2C, C4 Fp2Element kFieldOps.Add(&Aplus2C, &curve.C, &curve.C) // = 2*C kFieldOps.Add(&C4, &Aplus2C, &Aplus2C) // = 4*C kFieldOps.Add(&Aplus2C, &Aplus2C, &curve.A) // = 2*C + A x0.X = P503_OneFp2 x1 = *xP // Iterate over the bits of the scalar, top to bottom prevBit := uint8(0) for i := len(scalar) - 1; i >= 0; i-- { scalarByte := scalar[i] for j := 7; j >= 0; j-- { bit := (scalarByte >> uint(j)) & 0x1 kCurveOps.Params.Op.CondSwap(&x0.X, &x0.Z, &x1.X, &x1.Z, (bit ^ prevBit)) //sProjectivePointConditionalSwap(&x0, &x1, (bit ^ prevBit)) tmp = DoubleProjFp2(&x0, &Aplus2C, &C4) x1 = AddProjFp2(&x0, &x1, xP) x0 = tmp prevBit = bit } } // now prevBit is the lowest bit of the scalar kCurveOps.Params.Op.CondSwap(&x0.X, &x0.Z, &x1.X, &x1.Z, prevBit) return x0 } // Returns true if lhs = rhs. Takes variable time. func VartimeEqFp2(lhs, rhs *Fp2Element) bool { a := *lhs b := *rhs fp503StrongReduce(&a.A) fp503StrongReduce(&a.B) fp503StrongReduce(&b.A) fp503StrongReduce(&b.B) eq := true for i := 0; i < len(a.A) && eq; i++ { eq = eq && (a.A[i] == b.A[i]) eq = eq && (a.B[i] == b.B[i]) } return eq } // Returns true if lhs = rhs. Takes variable time. func VartimeEqProjFp2(lhs, rhs *ProjectivePoint) bool { var t0, t1 Fp2Element kFieldOps.Mul(&t0, &lhs.X, &rhs.Z) kFieldOps.Mul(&t1, &lhs.Z, &rhs.X) return VartimeEqFp2(&t0, &t1) } func (GeneratedTestParams) generateFp2p503(rand *rand.Rand) Fp2Element { // Generation strategy: low limbs taken from [0,2^64); high limb // taken from smaller range // // Size hint is ignored since all elements are fixed size. // // Field elements taken in range [0,2p). Emulate this by capping // the high limb by the top digit of 2*p-1: // // sage: (2*p-1).digits(2^64)[-1] // 36255204122967100 // // This still allows generating values >= 2p, but hopefully that // excess is OK (and if it's not, we'll find out, because it's for // testing...) // highLimb := rand.Uint64() % 36255204122967100 fpElementGen := func() FpElement { return FpElement{ rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), highLimb, } } return Fp2Element{A: fpElementGen(), B: fpElementGen()} } func (c GeneratedTestParams) Generate(rand *rand.Rand, size int) reflect.Value { return reflect.ValueOf( GeneratedTestParams{ ProjectivePoint{ X: c.generateFp2p503(rand), Z: c.generateFp2p503(rand), }, ProjectiveCurveParameters{ A: c.generateFp2p503(rand), C: c.generateFp2p503(rand), }, c.generateFp2p503(rand), }) } func (x primeFieldElement) Generate(rand *rand.Rand, size int) reflect.Value { return reflect.ValueOf(primeFieldElement{A: new(GeneratedTestParams).generateFp2p503(rand).A}) } // Convert an FpElement to a big.Int for testing. Because this is only // for testing, no big.Int to FpElement conversion is provided. func radix64ToBigInt(x []uint64) *big.Int { radix := new(big.Int) // 2^64 radix.UnmarshalText(([]byte)("18446744073709551616")) base := new(big.Int).SetUint64(1) val := new(big.Int).SetUint64(0) tmp := new(big.Int) for _, xi := range x { tmp.SetUint64(xi) tmp.Mul(tmp, base) val.Add(val, tmp) base.Mul(base, radix) } return val } func toBigInt(x *FpElement) *big.Int { // Convert from Montgomery form return toBigIntFromMontgomeryForm(x) } func toBigIntFromMontgomeryForm(x *FpElement) *big.Int { // Convert from Montgomery form a := FpElement{} aR := FpElementX2{} copy(aR[:], x[:]) // = a*R fp503MontgomeryReduce(&a, &aR) // = a mod p in [0,2p) fp503StrongReduce(&a) // = a mod p in [0,p) return radix64ToBigInt(a[:]) } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p751/000077500000000000000000000000001343600534300223215ustar00rootroot00000000000000golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p751/arith_amd64.s000066400000000000000000001314071343600534300246150ustar00rootroot00000000000000// +build amd64,!noasm #include "textflag.h" // p751 + 1 #define P751P1_5 $0xEEB0000000000000 #define P751P1_6 $0xE3EC968549F878A8 #define P751P1_7 $0xDA959B1A13F7CC76 #define P751P1_8 $0x084E9867D6EBE876 #define P751P1_9 $0x8562B5045CB25748 #define P751P1_10 $0x0E12909F97BADC66 #define P751P1_11 $0x00006FE5D541F71C #define P751_0 $0xFFFFFFFFFFFFFFFF #define P751_5 $0xEEAFFFFFFFFFFFFF #define P751_6 $0xE3EC968549F878A8 #define P751_7 $0xDA959B1A13F7CC76 #define P751_8 $0x084E9867D6EBE876 #define P751_9 $0x8562B5045CB25748 #define P751_10 $0x0E12909F97BADC66 #define P751_11 $0x00006FE5D541F71C #define P751X2_0 $0xFFFFFFFFFFFFFFFE #define P751X2_1 $0xFFFFFFFFFFFFFFFF #define P751X2_5 $0xDD5FFFFFFFFFFFFF #define P751X2_6 $0xC7D92D0A93F0F151 #define P751X2_7 $0xB52B363427EF98ED #define P751X2_8 $0x109D30CFADD7D0ED #define P751X2_9 $0x0AC56A08B964AE90 #define P751X2_10 $0x1C25213F2F75B8CD #define P751X2_11 $0x0000DFCBAA83EE38 // The MSR code uses these registers for parameter passing. Keep using // them to avoid significant code changes. This means that when the Go // assembler does something strange, we can diff the machine code // against a different assembler to find out what Go did. #define REG_P1 DI #define REG_P2 SI #define REG_P3 DX TEXT ·fp751StrongReduce(SB), NOSPLIT, $0-8 MOVQ x+0(FP), REG_P1 // Zero AX for later use: XORQ AX, AX // Load p into registers: MOVQ P751_0, R8 // P751_{1,2,3,4} = P751_0, so reuse R8 MOVQ P751_5, R9 MOVQ P751_6, R10 MOVQ P751_7, R11 MOVQ P751_8, R12 MOVQ P751_9, R13 MOVQ P751_10, R14 MOVQ P751_11, R15 // Set x <- x - p SUBQ R8, (REG_P1) SBBQ R8, (8)(REG_P1) SBBQ R8, (16)(REG_P1) SBBQ R8, (24)(REG_P1) SBBQ R8, (32)(REG_P1) SBBQ R9, (40)(REG_P1) SBBQ R10, (48)(REG_P1) SBBQ R11, (56)(REG_P1) SBBQ R12, (64)(REG_P1) SBBQ R13, (72)(REG_P1) SBBQ R14, (80)(REG_P1) SBBQ R15, (88)(REG_P1) // Save carry flag indicating x-p < 0 as a mask in AX SBBQ $0, AX // Conditionally add p to x if x-p < 0 ANDQ AX, R8 ANDQ AX, R9 ANDQ AX, R10 ANDQ AX, R11 ANDQ AX, R12 ANDQ AX, R13 ANDQ AX, R14 ANDQ AX, R15 ADDQ R8, (REG_P1) ADCQ R8, (8)(REG_P1) ADCQ R8, (16)(REG_P1) ADCQ R8, (24)(REG_P1) ADCQ R8, (32)(REG_P1) ADCQ R9, (40)(REG_P1) ADCQ R10, (48)(REG_P1) ADCQ R11, (56)(REG_P1) ADCQ R12, (64)(REG_P1) ADCQ R13, (72)(REG_P1) ADCQ R14, (80)(REG_P1) ADCQ R15, (88)(REG_P1) RET TEXT ·fp751ConditionalSwap(SB), NOSPLIT, $0-17 MOVQ x+0(FP), REG_P1 MOVQ y+8(FP), REG_P2 MOVB choice+16(FP), AL // AL = 0 or 1 MOVBLZX AL, AX // AX = 0 or 1 NEGQ AX // RAX = 0x00..00 or 0xff..ff MOVQ (0*8)(REG_P1), BX // BX = x[0] MOVQ (0*8)(REG_P2), CX // CX = y[0] MOVQ CX, DX // DX = y[0] XORQ BX, DX // DX = y[0] ^ x[0] ANDQ AX, DX // DX = (y[0] ^ x[0]) & mask XORQ DX, BX // BX = (y[0] ^ x[0]) & mask) ^ x[0] = x[0] or y[0] XORQ DX, CX // CX = (y[0] ^ x[0]) & mask) ^ y[0] = y[0] or x[0] MOVQ BX, (0*8)(REG_P1) MOVQ CX, (0*8)(REG_P2) MOVQ (1*8)(REG_P1), BX MOVQ (1*8)(REG_P2), CX MOVQ CX, DX XORQ BX, DX ANDQ AX, DX XORQ DX, BX XORQ DX, CX MOVQ BX, (1*8)(REG_P1) MOVQ CX, (1*8)(REG_P2) MOVQ (2*8)(REG_P1), BX MOVQ (2*8)(REG_P2), CX MOVQ CX, DX XORQ BX, DX ANDQ AX, DX XORQ DX, BX XORQ DX, CX MOVQ BX, (2*8)(REG_P1) MOVQ CX, (2*8)(REG_P2) MOVQ (3*8)(REG_P1), BX MOVQ (3*8)(REG_P2), CX MOVQ CX, DX XORQ BX, DX ANDQ AX, DX XORQ DX, BX XORQ DX, CX MOVQ BX, (3*8)(REG_P1) MOVQ CX, (3*8)(REG_P2) MOVQ (4*8)(REG_P1), BX MOVQ (4*8)(REG_P2), CX MOVQ CX, DX XORQ BX, DX ANDQ AX, DX XORQ DX, BX XORQ DX, CX MOVQ BX, (4*8)(REG_P1) MOVQ CX, (4*8)(REG_P2) MOVQ (5*8)(REG_P1), BX MOVQ (5*8)(REG_P2), CX MOVQ CX, DX XORQ BX, DX ANDQ AX, DX XORQ DX, BX XORQ DX, CX MOVQ BX, (5*8)(REG_P1) MOVQ CX, (5*8)(REG_P2) MOVQ (6*8)(REG_P1), BX MOVQ (6*8)(REG_P2), CX MOVQ CX, DX XORQ BX, DX ANDQ AX, DX XORQ DX, BX XORQ DX, CX MOVQ BX, (6*8)(REG_P1) MOVQ CX, (6*8)(REG_P2) MOVQ (7*8)(REG_P1), BX MOVQ (7*8)(REG_P2), CX MOVQ CX, DX XORQ BX, DX ANDQ AX, DX XORQ DX, BX XORQ DX, CX MOVQ BX, (7*8)(REG_P1) MOVQ CX, (7*8)(REG_P2) MOVQ (8*8)(REG_P1), BX MOVQ (8*8)(REG_P2), CX MOVQ CX, DX XORQ BX, DX ANDQ AX, DX XORQ DX, BX XORQ DX, CX MOVQ BX, (8*8)(REG_P1) MOVQ CX, (8*8)(REG_P2) MOVQ (9*8)(REG_P1), BX MOVQ (9*8)(REG_P2), CX MOVQ CX, DX XORQ BX, DX ANDQ AX, DX XORQ DX, BX XORQ DX, CX MOVQ BX, (9*8)(REG_P1) MOVQ CX, (9*8)(REG_P2) MOVQ (10*8)(REG_P1), BX MOVQ (10*8)(REG_P2), CX MOVQ CX, DX XORQ BX, DX ANDQ AX, DX XORQ DX, BX XORQ DX, CX MOVQ BX, (10*8)(REG_P1) MOVQ CX, (10*8)(REG_P2) MOVQ (11*8)(REG_P1), BX MOVQ (11*8)(REG_P2), CX MOVQ CX, DX XORQ BX, DX ANDQ AX, DX XORQ DX, BX XORQ DX, CX MOVQ BX, (11*8)(REG_P1) MOVQ CX, (11*8)(REG_P2) RET TEXT ·fp751AddReduced(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), CX ADDQ (REG_P2), R8 ADCQ (8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 ADCQ (48)(REG_P2), R14 ADCQ (56)(REG_P2), R15 ADCQ (64)(REG_P2), CX MOVQ (72)(REG_P1), AX ADCQ (72)(REG_P2), AX MOVQ AX, (72)(REG_P3) MOVQ (80)(REG_P1), AX ADCQ (80)(REG_P2), AX MOVQ AX, (80)(REG_P3) MOVQ (88)(REG_P1), AX ADCQ (88)(REG_P2), AX MOVQ AX, (88)(REG_P3) MOVQ P751X2_0, AX SUBQ AX, R8 MOVQ P751X2_1, AX SBBQ AX, R9 SBBQ AX, R10 SBBQ AX, R11 SBBQ AX, R12 MOVQ P751X2_5, AX SBBQ AX, R13 MOVQ P751X2_6, AX SBBQ AX, R14 MOVQ P751X2_7, AX SBBQ AX, R15 MOVQ P751X2_8, AX SBBQ AX, CX MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ CX, (64)(REG_P3) MOVQ (72)(REG_P3), R8 MOVQ (80)(REG_P3), R9 MOVQ (88)(REG_P3), R10 MOVQ P751X2_9, AX SBBQ AX, R8 MOVQ P751X2_10, AX SBBQ AX, R9 MOVQ P751X2_11, AX SBBQ AX, R10 MOVQ R8, (72)(REG_P3) MOVQ R9, (80)(REG_P3) MOVQ R10, (88)(REG_P3) MOVQ $0, AX SBBQ $0, AX MOVQ P751X2_0, SI ANDQ AX, SI MOVQ P751X2_1, R8 ANDQ AX, R8 MOVQ P751X2_5, R9 ANDQ AX, R9 MOVQ P751X2_6, R10 ANDQ AX, R10 MOVQ P751X2_7, R11 ANDQ AX, R11 MOVQ P751X2_8, R12 ANDQ AX, R12 MOVQ P751X2_9, R13 ANDQ AX, R13 MOVQ P751X2_10, R14 ANDQ AX, R14 MOVQ P751X2_11, R15 ANDQ AX, R15 MOVQ (REG_P3), AX ADDQ SI, AX MOVQ AX, (REG_P3) MOVQ (8)(REG_P3), AX ADCQ R8, AX MOVQ AX, (8)(REG_P3) MOVQ (16)(REG_P3), AX ADCQ R8, AX MOVQ AX, (16)(REG_P3) MOVQ (24)(REG_P3), AX ADCQ R8, AX MOVQ AX, (24)(REG_P3) MOVQ (32)(REG_P3), AX ADCQ R8, AX MOVQ AX, (32)(REG_P3) MOVQ (40)(REG_P3), AX ADCQ R9, AX MOVQ AX, (40)(REG_P3) MOVQ (48)(REG_P3), AX ADCQ R10, AX MOVQ AX, (48)(REG_P3) MOVQ (56)(REG_P3), AX ADCQ R11, AX MOVQ AX, (56)(REG_P3) MOVQ (64)(REG_P3), AX ADCQ R12, AX MOVQ AX, (64)(REG_P3) MOVQ (72)(REG_P3), AX ADCQ R13, AX MOVQ AX, (72)(REG_P3) MOVQ (80)(REG_P3), AX ADCQ R14, AX MOVQ AX, (80)(REG_P3) MOVQ (88)(REG_P3), AX ADCQ R15, AX MOVQ AX, (88)(REG_P3) RET TEXT ·fp751SubReduced(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), CX SUBQ (REG_P2), R8 SBBQ (8)(REG_P2), R9 SBBQ (16)(REG_P2), R10 SBBQ (24)(REG_P2), R11 SBBQ (32)(REG_P2), R12 SBBQ (40)(REG_P2), R13 SBBQ (48)(REG_P2), R14 SBBQ (56)(REG_P2), R15 SBBQ (64)(REG_P2), CX MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ CX, (64)(REG_P3) MOVQ (72)(REG_P1), AX SBBQ (72)(REG_P2), AX MOVQ AX, (72)(REG_P3) MOVQ (80)(REG_P1), AX SBBQ (80)(REG_P2), AX MOVQ AX, (80)(REG_P3) MOVQ (88)(REG_P1), AX SBBQ (88)(REG_P2), AX MOVQ AX, (88)(REG_P3) MOVQ $0, AX SBBQ $0, AX MOVQ P751X2_0, SI ANDQ AX, SI MOVQ P751X2_1, R8 ANDQ AX, R8 MOVQ P751X2_5, R9 ANDQ AX, R9 MOVQ P751X2_6, R10 ANDQ AX, R10 MOVQ P751X2_7, R11 ANDQ AX, R11 MOVQ P751X2_8, R12 ANDQ AX, R12 MOVQ P751X2_9, R13 ANDQ AX, R13 MOVQ P751X2_10, R14 ANDQ AX, R14 MOVQ P751X2_11, R15 ANDQ AX, R15 MOVQ (REG_P3), AX ADDQ SI, AX MOVQ AX, (REG_P3) MOVQ (8)(REG_P3), AX ADCQ R8, AX MOVQ AX, (8)(REG_P3) MOVQ (16)(REG_P3), AX ADCQ R8, AX MOVQ AX, (16)(REG_P3) MOVQ (24)(REG_P3), AX ADCQ R8, AX MOVQ AX, (24)(REG_P3) MOVQ (32)(REG_P3), AX ADCQ R8, AX MOVQ AX, (32)(REG_P3) MOVQ (40)(REG_P3), AX ADCQ R9, AX MOVQ AX, (40)(REG_P3) MOVQ (48)(REG_P3), AX ADCQ R10, AX MOVQ AX, (48)(REG_P3) MOVQ (56)(REG_P3), AX ADCQ R11, AX MOVQ AX, (56)(REG_P3) MOVQ (64)(REG_P3), AX ADCQ R12, AX MOVQ AX, (64)(REG_P3) MOVQ (72)(REG_P3), AX ADCQ R13, AX MOVQ AX, (72)(REG_P3) MOVQ (80)(REG_P3), AX ADCQ R14, AX MOVQ AX, (80)(REG_P3) MOVQ (88)(REG_P3), AX ADCQ R15, AX MOVQ AX, (88)(REG_P3) RET TEXT ·fp751Mul(SB), $96-24 // Here we store the destination in CX instead of in REG_P3 because the // multiplication instructions use DX as an implicit destination // operand: MULQ $REG sets DX:AX <-- AX * $REG. MOVQ z+0(FP), CX MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 XORQ AX, AX MOVQ (48)(REG_P1), R8 MOVQ (56)(REG_P1), R9 MOVQ (64)(REG_P1), R10 MOVQ (72)(REG_P1), R11 MOVQ (80)(REG_P1), R12 MOVQ (88)(REG_P1), R13 ADDQ (REG_P1), R8 ADCQ (8)(REG_P1), R9 ADCQ (16)(REG_P1), R10 ADCQ (24)(REG_P1), R11 ADCQ (32)(REG_P1), R12 ADCQ (40)(REG_P1), R13 MOVQ R8, (CX) MOVQ R9, (8)(CX) MOVQ R10, (16)(CX) MOVQ R11, (24)(CX) MOVQ R12, (32)(CX) MOVQ R13, (40)(CX) SBBQ $0, AX XORQ DX, DX MOVQ (48)(REG_P2), R8 MOVQ (56)(REG_P2), R9 MOVQ (64)(REG_P2), R10 MOVQ (72)(REG_P2), R11 MOVQ (80)(REG_P2), R12 MOVQ (88)(REG_P2), R13 ADDQ (REG_P2), R8 ADCQ (8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 MOVQ R8, (48)(CX) MOVQ R9, (56)(CX) MOVQ R10, (64)(CX) MOVQ R11, (72)(CX) MOVQ R12, (80)(CX) MOVQ R13, (88)(CX) SBBQ $0, DX MOVQ AX, (80)(SP) MOVQ DX, (88)(SP) // (SP[0-8],R10,R8,R9) <- (AH+AL)*(BH+BL) MOVQ (CX), R11 MOVQ R8, AX MULQ R11 MOVQ AX, (SP) // c0 MOVQ DX, R14 XORQ R15, R15 MOVQ R9, AX MULQ R11 XORQ R9, R9 ADDQ AX, R14 ADCQ DX, R9 MOVQ (8)(CX), R12 MOVQ R8, AX MULQ R12 ADDQ AX, R14 MOVQ R14, (8)(SP) // c1 ADCQ DX, R9 ADCQ $0, R15 XORQ R8, R8 MOVQ R10, AX MULQ R11 ADDQ AX, R9 MOVQ (48)(CX), R13 ADCQ DX, R15 ADCQ $0, R8 MOVQ (16)(CX), AX MULQ R13 ADDQ AX, R9 ADCQ DX, R15 MOVQ (56)(CX), AX ADCQ $0, R8 MULQ R12 ADDQ AX, R9 MOVQ R9, (16)(SP) // c2 ADCQ DX, R15 ADCQ $0, R8 XORQ R9, R9 MOVQ (72)(CX), AX MULQ R11 ADDQ AX, R15 ADCQ DX, R8 ADCQ $0, R9 MOVQ (24)(CX), AX MULQ R13 ADDQ AX, R15 ADCQ DX, R8 ADCQ $0, R9 MOVQ R10, AX MULQ R12 ADDQ AX, R15 ADCQ DX, R8 ADCQ $0, R9 MOVQ (16)(CX), R14 MOVQ (56)(CX), AX MULQ R14 ADDQ AX, R15 MOVQ R15, (24)(SP) // c3 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (80)(CX), AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (64)(CX), AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (48)(CX), R15 MOVQ (32)(CX), AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (72)(CX), AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (24)(CX), R13 MOVQ (56)(CX), AX MULQ R13 ADDQ AX, R8 MOVQ R8, (32)(SP) // c4 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (88)(CX), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (64)(CX), AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (72)(CX), AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (40)(CX), AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (80)(CX), AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (32)(CX), R15 MOVQ (56)(CX), AX MULQ R15 ADDQ AX, R9 MOVQ R9, (40)(SP) // c5 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (64)(CX), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (88)(CX), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (80)(CX), AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (40)(CX), R11 MOVQ (56)(CX), AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (72)(CX), AX MULQ R13 ADDQ AX, R10 MOVQ R10, (48)(SP) // c6 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (88)(CX), AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (64)(CX), AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (80)(CX), AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (72)(CX), AX MULQ R15 ADDQ AX, R8 MOVQ R8, (56)(SP) // c7 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (72)(CX), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (80)(CX), AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (88)(CX), AX MULQ R13 ADDQ AX, R9 MOVQ R9, (64)(SP) // c8 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (88)(CX), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (80)(CX), AX MULQ R11 ADDQ AX, R10 // c9 ADCQ DX, R8 ADCQ $0, R9 MOVQ (88)(CX), AX MULQ R11 ADDQ AX, R8 // c10 ADCQ DX, R9 // c11 MOVQ (88)(SP), AX MOVQ (CX), DX ANDQ AX, R12 ANDQ AX, R14 ANDQ AX, DX ANDQ AX, R13 ANDQ AX, R15 ANDQ AX, R11 MOVQ (48)(SP), AX ADDQ AX, DX MOVQ (56)(SP), AX ADCQ AX, R12 MOVQ (64)(SP), AX ADCQ AX, R14 ADCQ R10, R13 ADCQ R8, R15 ADCQ R9, R11 MOVQ (80)(SP), AX MOVQ DX, (48)(SP) MOVQ R12, (56)(SP) MOVQ R14, (64)(SP) MOVQ R13, (72)(SP) MOVQ R15, (80)(SP) MOVQ R11, (88)(SP) MOVQ (48)(CX), R8 MOVQ (56)(CX), R9 MOVQ (64)(CX), R10 MOVQ (72)(CX), R11 MOVQ (80)(CX), R12 MOVQ (88)(CX), R13 ANDQ AX, R8 ANDQ AX, R9 ANDQ AX, R10 ANDQ AX, R11 ANDQ AX, R12 ANDQ AX, R13 MOVQ (48)(SP), AX ADDQ AX, R8 MOVQ (56)(SP), AX ADCQ AX, R9 MOVQ (64)(SP), AX ADCQ AX, R10 MOVQ (72)(SP), AX ADCQ AX, R11 MOVQ (80)(SP), AX ADCQ AX, R12 MOVQ (88)(SP), AX ADCQ AX, R13 MOVQ R8, (48)(SP) MOVQ R9, (56)(SP) MOVQ R11, (72)(SP) // CX[0-11] <- AL*BL MOVQ (REG_P1), R11 MOVQ (REG_P2), AX MULQ R11 XORQ R9, R9 MOVQ AX, (CX) // c0 MOVQ R10, (64)(SP) MOVQ DX, R8 MOVQ (8)(REG_P2), AX MULQ R11 XORQ R10, R10 ADDQ AX, R8 MOVQ R12, (80)(SP) ADCQ DX, R9 MOVQ (8)(REG_P1), R12 MOVQ (REG_P2), AX MULQ R12 ADDQ AX, R8 MOVQ R8, (8)(CX) // c1 ADCQ DX, R9 MOVQ R13, (88)(SP) ADCQ $0, R10 XORQ R8, R8 MOVQ (16)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (REG_P2), R13 MOVQ (16)(REG_P1), AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (8)(REG_P2), AX MULQ R12 ADDQ AX, R9 MOVQ R9, (16)(CX) // c2 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (24)(REG_P2), AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (24)(REG_P1), AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (16)(REG_P2), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (16)(REG_P1), R14 MOVQ (8)(REG_P2), AX MULQ R14 ADDQ AX, R10 MOVQ R10, (24)(CX) // c3 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (32)(REG_P2), AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (16)(REG_P2), AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (32)(REG_P1), AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (24)(REG_P2), AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (24)(REG_P1), R13 MOVQ (8)(REG_P2), AX MULQ R13 ADDQ AX, R8 MOVQ R8, (32)(CX) // c4 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (40)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (16)(REG_P2), AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (24)(REG_P2), AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (40)(REG_P1), R11 MOVQ (REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (32)(REG_P2), AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (32)(REG_P1), R15 MOVQ (8)(REG_P2), AX MULQ R15 ADDQ AX, R9 MOVQ R9, (40)(CX) //c5 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (16)(REG_P2), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (40)(REG_P2), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (32)(REG_P2), AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (8)(REG_P2), AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (24)(REG_P2), AX MULQ R13 ADDQ AX, R10 MOVQ R10, (48)(CX) // c6 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (40)(REG_P2), AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (16)(REG_P2), AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (32)(REG_P2), AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (24)(REG_P2), AX MULQ R15 ADDQ AX, R8 MOVQ R8, (56)(CX) // c7 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (24)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (32)(REG_P2), AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (40)(REG_P2), AX MULQ R13 ADDQ AX, R9 MOVQ R9, (64)(CX) // c8 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (40)(REG_P2), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (32)(REG_P2), AX MULQ R11 ADDQ AX, R10 MOVQ R10, (72)(CX) // c9 ADCQ DX, R8 ADCQ $0, R9 MOVQ (40)(REG_P2), AX MULQ R11 ADDQ AX, R8 MOVQ R8, (80)(CX) // c10 ADCQ DX, R9 MOVQ R9, (88)(CX) // c11 // CX[12-23] <- AH*BH MOVQ (48)(REG_P1), R11 MOVQ (48)(REG_P2), AX MULQ R11 XORQ R9, R9 MOVQ AX, (96)(CX) // c0 MOVQ DX, R8 MOVQ (56)(REG_P2), AX MULQ R11 XORQ R10, R10 ADDQ AX, R8 ADCQ DX, R9 MOVQ (56)(REG_P1), R12 MOVQ (48)(REG_P2), AX MULQ R12 ADDQ AX, R8 MOVQ R8, (104)(CX) // c1 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (64)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (48)(REG_P2), R13 MOVQ (64)(REG_P1), AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (56)(REG_P2), AX MULQ R12 ADDQ AX, R9 MOVQ R9, (112)(CX) // c2 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (72)(REG_P2), AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (72)(REG_P1), AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (64)(REG_P2), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (64)(REG_P1), R14 MOVQ (56)(REG_P2), AX MULQ R14 ADDQ AX, R10 MOVQ R10, (120)(CX) // c3 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (80)(REG_P2), AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (64)(REG_P2), AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (80)(REG_P1), R15 MOVQ R13, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (72)(REG_P2), AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (72)(REG_P1), R13 MOVQ (56)(REG_P2), AX MULQ R13 ADDQ AX, R8 MOVQ R8, (128)(CX) // c4 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (88)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (64)(REG_P2), AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (72)(REG_P2), AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (88)(REG_P1), R11 MOVQ (48)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (80)(REG_P2), AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (56)(REG_P2), AX MULQ R15 ADDQ AX, R9 MOVQ R9, (136)(CX) // c5 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (64)(REG_P2), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (88)(REG_P2), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (80)(REG_P2), AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (56)(REG_P2), AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (72)(REG_P2), AX MULQ R13 ADDQ AX, R10 MOVQ R10, (144)(CX) // c6 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (88)(REG_P2), AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (64)(REG_P2), AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (80)(REG_P2), AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (72)(REG_P2), AX MULQ R15 ADDQ AX, R8 MOVQ R8, (152)(CX) // c7 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (72)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (80)(REG_P2), AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (88)(REG_P2), AX MULQ R13 ADDQ AX, R9 MOVQ R9, (160)(CX) // c8 ADCQ DX, R10 ADCQ $0, R8 MOVQ (88)(REG_P2), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 MOVQ (80)(REG_P2), AX MULQ R11 ADDQ AX, R10 MOVQ R10, (168)(CX) // c9 ADCQ DX, R8 MOVQ (88)(REG_P2), AX MULQ R11 ADDQ AX, R8 MOVQ R8, (176)(CX) // c10 ADCQ $0, DX MOVQ DX, (184)(CX) // c11 // [R8-R15,AX,DX,DI,(SP)] <- (AH+AL)*(BH+BL)-AL*BL MOVQ (SP), R8 SUBQ (CX), R8 MOVQ (8)(SP), R9 SBBQ (8)(CX), R9 MOVQ (16)(SP), R10 SBBQ (16)(CX), R10 MOVQ (24)(SP), R11 SBBQ (24)(CX), R11 MOVQ (32)(SP), R12 SBBQ (32)(CX), R12 MOVQ (40)(SP), R13 SBBQ (40)(CX), R13 MOVQ (48)(SP), R14 SBBQ (48)(CX), R14 MOVQ (56)(SP), R15 SBBQ (56)(CX), R15 MOVQ (64)(SP), AX SBBQ (64)(CX), AX MOVQ (72)(SP), DX SBBQ (72)(CX), DX MOVQ (80)(SP), DI SBBQ (80)(CX), DI MOVQ (88)(SP), SI SBBQ (88)(CX), SI MOVQ SI, (SP) // [R8-R15,AX,DX,DI,(SP)] <- (AH+AL)*(BH+BL) - AL*BL - AH*BH MOVQ (96)(CX), SI SUBQ SI, R8 MOVQ (104)(CX), SI SBBQ SI, R9 MOVQ (112)(CX), SI SBBQ SI, R10 MOVQ (120)(CX), SI SBBQ SI, R11 MOVQ (128)(CX), SI SBBQ SI, R12 MOVQ (136)(CX), SI SBBQ SI, R13 MOVQ (144)(CX), SI SBBQ SI, R14 MOVQ (152)(CX), SI SBBQ SI, R15 MOVQ (160)(CX), SI SBBQ SI, AX MOVQ (168)(CX), SI SBBQ SI, DX MOVQ (176)(CX), SI SBBQ SI, DI MOVQ (SP), SI SBBQ (184)(CX), SI // FINAL RESULT ADDQ (48)(CX), R8 MOVQ R8, (48)(CX) ADCQ (56)(CX), R9 MOVQ R9, (56)(CX) ADCQ (64)(CX), R10 MOVQ R10, (64)(CX) ADCQ (72)(CX), R11 MOVQ R11, (72)(CX) ADCQ (80)(CX), R12 MOVQ R12, (80)(CX) ADCQ (88)(CX), R13 MOVQ R13, (88)(CX) ADCQ (96)(CX), R14 MOVQ R14, (96)(CX) ADCQ (104)(CX), R15 MOVQ R15, (104)(CX) ADCQ (112)(CX), AX MOVQ AX, (112)(CX) ADCQ (120)(CX), DX MOVQ DX, (120)(CX) ADCQ (128)(CX), DI MOVQ DI, (128)(CX) ADCQ (136)(CX), SI MOVQ SI, (136)(CX) MOVQ (144)(CX), AX ADCQ $0, AX MOVQ AX, (144)(CX) MOVQ (152)(CX), AX ADCQ $0, AX MOVQ AX, (152)(CX) MOVQ (160)(CX), AX ADCQ $0, AX MOVQ AX, (160)(CX) MOVQ (168)(CX), AX ADCQ $0, AX MOVQ AX, (168)(CX) MOVQ (176)(CX), AX ADCQ $0, AX MOVQ AX, (176)(CX) MOVQ (184)(CX), AX ADCQ $0, AX MOVQ AX, (184)(CX) RET // This multiplies a 256-bit number pointed to by M0 with p751+1. // It is assumed that M1 points to p751+1 stored as a 768-bit Fp751Element. // C points to the place to store the result and should be at least 192 bits. // This should only be used when the BMI2 and ADX instruction set extensions // are available. #define mul256x448bmi2adx(M0, M1, C, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) \ MOVQ 0+M0, DX \ MULXQ M1+40(SB), T1, T0 \ MULXQ M1+48(SB), T3, T2 \ MOVQ T1, 0+C \ // C0_final XORQ AX, AX \ MULXQ M1+56(SB), T5, T4 \ ADOXQ T3, T0 \ ADOXQ T5, T2 \ MULXQ M1+64(SB), T3, T1 \ ADOXQ T3, T4 \ MULXQ M1+72(SB), T6, T5 \ ADOXQ T6, T1 \ MULXQ M1+80(SB), T7, T3 \ ADOXQ T7, T5 \ MULXQ M1+88(SB), T8, T6 \ ADOXQ T8, T3 \ ADOXQ AX, T6 \ \ MOVQ 8+M0, DX \ MULXQ M1+40(SB), T7, T8 \ XORQ AX, AX \ ADCXQ T7, T0 \ MOVQ T0, 8+C \ // C1_final ADCXQ T8, T2 \ MULXQ M1+48(SB), T8, T7 \ ADOXQ T8, T2 \ ADCXQ T7, T4 \ MULXQ M1+56(SB), T8, T0 \ ADOXQ T8, T4 \ ADCXQ T1, T0 \ MULXQ M1+64(SB), T7, T1 \ ADCXQ T5, T1 \ MULXQ M1+72(SB), T8, T5 \ ADCXQ T5, T3 \ MULXQ M1+80(SB), T9, T5 \ ADCXQ T5, T6 \ MULXQ M1+88(SB), DX, T5 \ ADCXQ AX, T5 \ \ ADOXQ T7, T0 \ ADOXQ T8, T1 \ ADOXQ T9, T3 \ ADOXQ DX, T6 \ ADOXQ AX, T5 \ \ MOVQ 16+M0, DX \ MULXQ M1+40(SB), T7, T8 \ XORQ AX, AX \ ADCXQ T7, T2 \ MOVQ T2, 16+C \ // C2_final ADCXQ T8, T4 \ MULXQ M1+48(SB), T7, T8 \ ADOXQ T7, T4 \ ADCXQ T8, T0 \ MULXQ M1+56(SB), T8, T2 \ ADOXQ T8, T0 \ ADCXQ T2, T1 \ MULXQ M1+64(SB), T7, T2 \ ADCXQ T2, T3 \ MULXQ M1+72(SB), T8, T2 \ ADCXQ T2, T6 \ MULXQ M1+80(SB), T9, T2 \ ADCXQ T2, T5 \ MULXQ M1+88(SB), DX, T2 \ ADCXQ AX, T2 \ \ ADOXQ T7, T1 \ ADOXQ T8, T3 \ ADOXQ T9, T6 \ ADOXQ DX, T5 \ ADOXQ AX, T2 \ \ MOVQ 24+M0, DX \ MULXQ M1+40(SB), T7, T8 \ XORQ AX, AX \ ADCXQ T4, T7 \ ADCXQ T8, T0 \ MULXQ M1+48(SB), T10, T8 \ ADOXQ T10, T0 \ ADCXQ T8, T1 \ MULXQ M1+56(SB), T8, T4 \ ADOXQ T8, T1 \ ADCXQ T4, T3 \ MULXQ M1+64(SB), T10, T4 \ ADCXQ T4, T6 \ MULXQ M1+72(SB), T8, T4 \ ADCXQ T4, T5 \ MULXQ M1+80(SB), T9, T4 \ ADCXQ T4, T2 \ MULXQ M1+88(SB), DX, T4 \ ADCXQ AX, T4 \ \ ADOXQ T10, T3 \ ADOXQ T8, T6 \ ADOXQ T9, T5 \ ADOXQ DX, T2 \ ADOXQ AX, T4 // This multiplies a 256-bit number pointed to by M0 with p751+1. // It is assumed that M1 points to p751+1 stored as a 768-bit Fp751Element. // C points to the place to store the result and should be at least 192 bits. // This should only be used when the BMI2 instruction set extension is // available. #define mul256x448bmi2(M0, M1, C, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) \ MOVQ 0+M0, DX \ MULXQ M1+40(SB), T1, T0 \ MULXQ M1+48(SB), T3, T2 \ MOVQ T1, 0+C \ // C0_final XORQ AX, AX \ MULXQ M1+56(SB), T5, T4 \ ADDQ T3, T0 \ ADCQ T5, T2 \ MULXQ M1+64(SB), T3, T1 \ ADCQ T3, T4 \ MULXQ M1+72(SB), T6, T5 \ ADCQ T6, T1 \ MULXQ M1+80(SB), T7, T3 \ ADCQ T7, T5 \ MULXQ M1+88(SB), T8, T6 \ ADCQ T8, T3 \ ADCQ AX, T6 \ \ MOVQ 8+M0, DX \ MULXQ M1+40(SB), T7, T8 \ ADDQ T7, T0 \ MOVQ T0, 8+C \ // C1_final ADCQ T8, T2 \ MULXQ M1+48(SB), T8, T7 \ MOVQ T8, 32+C \ ADCQ T7, T4 \ MULXQ M1+56(SB), T8, T0 \ MOVQ T8, 40+C \ ADCQ T1, T0 \ MULXQ M1+64(SB), T7, T1 \ ADCQ T5, T1 \ MULXQ M1+72(SB), T8, T5 \ ADCQ T5, T3 \ MULXQ M1+80(SB), T9, T5 \ ADCQ T5, T6 \ MULXQ M1+88(SB), DX, T5 \ ADCQ AX, T5 \ \ XORQ AX, AX \ ADDQ 32+C, T2 \ ADCQ 40+C, T4 \ ADCQ T7, T0 \ ADCQ T8, T1 \ ADCQ T9, T3 \ ADCQ DX, T6 \ ADCQ AX, T5 \ \ MOVQ 16+M0, DX \ MULXQ M1+40(SB), T7, T8 \ ADDQ T7, T2 \ MOVQ T2, 16+C \ // C2_final ADCQ T8, T4 \ MULXQ M1+48(SB), T7, T8 \ MOVQ T7, 32+C \ ADCQ T8, T0 \ MULXQ M1+56(SB), T8, T2 \ MOVQ T8, 40+C \ ADCQ T2, T1 \ MULXQ M1+64(SB), T7, T2 \ ADCQ T2, T3 \ MULXQ M1+72(SB), T8, T2 \ ADCQ T2, T6 \ MULXQ M1+80(SB), T9, T2 \ ADCQ T2, T5 \ MULXQ M1+88(SB), DX, T2 \ ADCQ AX, T2 \ \ XORQ AX, AX \ ADDQ 32+C, T4 \ ADCQ 40+C, T0 \ ADCQ T7, T1 \ ADCQ T8, T3 \ ADCQ T9, T6 \ ADCQ DX, T5 \ ADCQ AX, T2 \ \ MOVQ 24+M0, DX \ MULXQ M1+40(SB), T7, T8 \ ADDQ T4, T7 \ ADCQ T8, T0 \ MULXQ M1+48(SB), T10, T8 \ MOVQ T10, 32+C \ ADCQ T8, T1 \ MULXQ M1+56(SB), T8, T4 \ MOVQ T8, 40+C \ ADCQ T4, T3 \ MULXQ M1+64(SB), T10, T4 \ ADCQ T4, T6 \ MULXQ M1+72(SB), T8, T4 \ ADCQ T4, T5 \ MULXQ M1+80(SB), T9, T4 \ ADCQ T4, T2 \ MULXQ M1+88(SB), DX, T4 \ ADCQ AX, T4 \ \ XORQ AX, AX \ ADDQ 32+C, T0 \ ADCQ 40+C, T1 \ ADCQ T10, T3 \ ADCQ T8, T6 \ ADCQ T9, T5 \ ADCQ DX, T2 \ ADCQ AX, T4 // Template for calculating the Montgomery reduction algorithm described in // section 5.2.3 of https://eprint.iacr.org/2017/1015.pdf. Template must be // customized with schoolbook multiplicaton for 256 x 448-bit number. // This macro reuses memory of IN value and *changes* it. Smashes registers // R[8-15], AX, BX, CX, DX, BP. // Input: // * M0: 1536-bit number to be reduced // * C : either mul256x448bmi2 or mul256x448bmi2adx // Output: OUT 768-bit #define REDC(C, M0, MULS) \ \ // a[0-3] x p751p1_nz --> result: [reg_p2+48], [reg_p2+56], [reg_p2+64], and rbp, r8:r14 MULS(M0, ·p751p1, 48+C, R8, R9, R13, R10, R14, R12, R11, BP, BX, CX, R15) \ XORQ R15, R15 \ MOVQ 48+C, AX \ MOVQ 56+C, DX \ MOVQ 64+C, BX \ ADDQ 40+M0, AX \ ADCQ 48+M0, DX \ ADCQ 56+M0, BX \ MOVQ AX, 40+M0 \ MOVQ DX, 48+M0 \ MOVQ BX, 56+M0 \ ADCQ 64+M0, BP \ ADCQ 72+M0, R8 \ ADCQ 80+M0, R9 \ ADCQ 88+M0, R10 \ ADCQ 96+M0, R11 \ ADCQ 104+M0, R12 \ ADCQ 112+M0, R13 \ ADCQ 120+M0, R14 \ ADCQ 128+M0, R15 \ MOVQ BP, 64+M0 \ MOVQ R8, 72+M0 \ MOVQ R9, 80+M0 \ MOVQ R10, 88+M0 \ MOVQ R11, 96+M0 \ MOVQ R12, 104+M0 \ MOVQ R13, 112+M0 \ MOVQ R14, 120+M0 \ MOVQ R15, 128+M0 \ MOVQ 136+M0, R8 \ MOVQ 144+M0, R9 \ MOVQ 152+M0, R10 \ MOVQ 160+M0, R11 \ MOVQ 168+M0, R12 \ MOVQ 176+M0, R13 \ MOVQ 184+M0, R14 \ ADCQ $0, R8 \ ADCQ $0, R9 \ ADCQ $0, R10 \ ADCQ $0, R11 \ ADCQ $0, R12 \ ADCQ $0, R13 \ ADCQ $0, R14 \ MOVQ R8, 136+M0 \ MOVQ R9, 144+M0 \ MOVQ R10, 152+M0 \ MOVQ R11, 160+M0 \ MOVQ R12, 168+M0 \ MOVQ R13, 176+M0 \ MOVQ R14, 184+M0 \ \ // a[4-7] x p751p1_nz --> result: [reg_p2+48], [reg_p2+56], [reg_p2+64], and rbp, r8:r14 MULS(32+M0, ·p751p1, 48+C, R8, R9, R13, R10, R14, R12, R11, BP, BX, CX, R15) \ XORQ R15, R15 \ MOVQ 48+C, AX \ MOVQ 56+C, DX \ MOVQ 64+C, BX \ ADDQ 72+M0, AX \ ADCQ 80+M0, DX \ ADCQ 88+M0, BX \ MOVQ AX, 72+M0 \ MOVQ DX, 80+M0 \ MOVQ BX, 88+M0 \ ADCQ 96+M0, BP \ ADCQ 104+M0, R8 \ ADCQ 112+M0, R9 \ ADCQ 120+M0, R10 \ ADCQ 128+M0, R11 \ ADCQ 136+M0, R12 \ ADCQ 144+M0, R13 \ ADCQ 152+M0, R14 \ ADCQ 160+M0, R15 \ MOVQ BP, 0+C \ // Final result c0 MOVQ R8, 104+M0 \ MOVQ R9, 112+M0 \ MOVQ R10, 120+M0 \ MOVQ R11, 128+M0 \ MOVQ R12, 136+M0 \ MOVQ R13, 144+M0 \ MOVQ R14, 152+M0 \ MOVQ R15, 160+M0 \ MOVQ 168+M0, R12 \ MOVQ 176+M0, R13 \ MOVQ 184+M0, R14 \ ADCQ $0, R12 \ ADCQ $0, R13 \ ADCQ $0, R14 \ MOVQ R12, 168+M0 \ MOVQ R13, 176+M0 \ MOVQ R14, 184+M0 \ \ // a[8-11] x p751p1_nz --> result: [reg_p2+48], [reg_p2+56], [reg_p2+64], and rbp, r8:r14 MULS(64+M0, ·p751p1, 48+C, R8, R9, R13, R10, R14, R12, R11, BP, BX, CX, R15) \ MOVQ 48+C, AX \ // Final result c1:c11 MOVQ 56+C, DX \ MOVQ 64+C, BX \ ADDQ 104+M0, AX \ ADCQ 112+M0, DX \ ADCQ 120+M0, BX \ MOVQ AX, 8+C \ MOVQ DX, 16+C \ MOVQ BX, 24+C \ ADCQ 128+M0, BP \ ADCQ 136+M0, R8 \ ADCQ 144+M0, R9 \ ADCQ 152+M0, R10 \ ADCQ 160+M0, R11 \ ADCQ 168+M0, R12 \ ADCQ 176+M0, R13 \ ADCQ 184+M0, R14 \ MOVQ BP, 32+C \ MOVQ R8, 40+C \ MOVQ R9, 48+C \ MOVQ R10, 56+C \ MOVQ R11, 64+C \ MOVQ R12, 72+C \ MOVQ R13, 80+C \ MOVQ R14, 88+C TEXT ·fp751MontgomeryReduce(SB), $0-16 MOVQ z+0(FP), REG_P2 MOVQ x+8(FP), REG_P1 // Check wether to use optimized implementation CMPB ·HasADXandBMI2(SB), $1 JE redc_with_mulx_adcx_adox CMPB ·HasBMI2(SB), $1 JE redc_with_mulx MOVQ (REG_P1), R11 MOVQ P751P1_5, AX MULQ R11 XORQ R8, R8 ADDQ (40)(REG_P1), AX MOVQ AX, (40)(REG_P2) // Z5 ADCQ DX, R8 XORQ R9, R9 MOVQ P751P1_6, AX MULQ R11 XORQ R10, R10 ADDQ AX, R8 ADCQ DX, R9 MOVQ (8)(REG_P1), R12 MOVQ P751P1_5, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (48)(REG_P1), R8 MOVQ R8, (48)(REG_P2) // Z6 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P751P1_7, AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_6, AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (16)(REG_P1), R13 MOVQ P751P1_5, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (56)(REG_P1), R9 MOVQ R9, (56)(REG_P2) // Z7 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P751P1_8, AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_7, AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_6, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (24)(REG_P1), R14 MOVQ P751P1_5, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (64)(REG_P1), R10 MOVQ R10, (64)(REG_P2) // Z8 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P751P1_9, AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_8, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_7, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_6, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (32)(REG_P1), R15 MOVQ P751P1_5, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (72)(REG_P1), R8 MOVQ R8, (72)(REG_P2) // Z9 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P751P1_10, AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_9, AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_8, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_7, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_6, AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (40)(REG_P2), CX MOVQ P751P1_5, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (80)(REG_P1), R9 MOVQ R9, (80)(REG_P2) // Z10 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P751P1_11, AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_10, AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_9, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_8, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_7, AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_6, AX MULQ CX ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (48)(REG_P2), R11 MOVQ P751P1_5, AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (88)(REG_P1), R10 MOVQ R10, (88)(REG_P2) // Z11 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P751P1_11, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_10, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_9, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_8, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_7, AX MULQ CX ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_6, AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (56)(REG_P2), R12 MOVQ P751P1_5, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (96)(REG_P1), R8 MOVQ R8, (REG_P2) // Z0 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P751P1_11, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_10, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_9, AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_8, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_7, AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_6, AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (64)(REG_P2), R13 MOVQ P751P1_5, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (104)(REG_P1), R9 MOVQ R9, (8)(REG_P2) // Z1 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P751P1_11, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_10, AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_9, AX MULQ CX ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_8, AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_7, AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_6, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (72)(REG_P2), R14 MOVQ P751P1_5, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (112)(REG_P1), R10 MOVQ R10, (16)(REG_P2) // Z2 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P751P1_11, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_10, AX MULQ CX ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_9, AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_8, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_7, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_6, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (80)(REG_P2), R15 MOVQ P751P1_5, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (120)(REG_P1), R8 MOVQ R8, (24)(REG_P2) // Z3 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P751P1_11, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_10, AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_9, AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_8, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_7, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_6, AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (88)(REG_P2), CX MOVQ P751P1_5, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (128)(REG_P1), R9 MOVQ R9, (32)(REG_P2) // Z4 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P751P1_11, AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_10, AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_9, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_8, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_7, AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_6, AX MULQ CX ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (136)(REG_P1), R10 MOVQ R10, (40)(REG_P2) // Z5 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P751P1_11, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_10, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_9, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_8, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_7, AX MULQ CX ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (144)(REG_P1), R8 MOVQ R8, (48)(REG_P2) // Z6 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P751P1_11, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_10, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_9, AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_8, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (152)(REG_P1), R9 MOVQ R9, (56)(REG_P2) // Z7 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P751P1_11, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_10, AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_9, AX MULQ CX ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (160)(REG_P1), R10 MOVQ R10, (64)(REG_P2) // Z8 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P751P1_11, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_10, AX MULQ CX ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (168)(REG_P1), R8 // Z9 MOVQ R8, (72)(REG_P2) // Z9 ADCQ $0, R9 ADCQ $0, R10 MOVQ P751P1_11, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADDQ (176)(REG_P1), R9 // Z10 MOVQ R9, (80)(REG_P2) // Z10 ADCQ $0, R10 ADDQ (184)(REG_P1), R10 // Z11 MOVQ R10, (88)(REG_P2) // Z11 RET redc_with_mulx_adcx_adox: // This implements the Montgomery reduction algorithm described in // section 5.2.3 of https://eprint.iacr.org/2017/1015.pdf. // This assumes that the BMI2 and ADX instruction set extensions are available. REDC(0(REG_P2), 0(REG_P1), mul256x448bmi2adx) RET redc_with_mulx: // This implements the Montgomery reduction algorithm described in // section 5.2.3 of https://eprint.iacr.org/2017/1015.pdf. // This assumes that the BMI2 instruction set extension is available. REDC(0(REG_P2), 0(REG_P1), mul256x448bmi2) RET TEXT ·fp751AddLazy(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), AX MOVQ (72)(REG_P1), BX MOVQ (80)(REG_P1), CX MOVQ (88)(REG_P1), DI ADDQ (REG_P2), R8 ADCQ (8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 ADCQ (48)(REG_P2), R14 ADCQ (56)(REG_P2), R15 ADCQ (64)(REG_P2), AX ADCQ (72)(REG_P2), BX ADCQ (80)(REG_P2), CX ADCQ (88)(REG_P2), DI MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ AX, (64)(REG_P3) MOVQ BX, (72)(REG_P3) MOVQ CX, (80)(REG_P3) MOVQ DI, (88)(REG_P3) RET TEXT ·fp751X2AddLazy(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), AX MOVQ (72)(REG_P1), BX MOVQ (80)(REG_P1), CX ADDQ (REG_P2), R8 ADCQ (8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 ADCQ (48)(REG_P2), R14 ADCQ (56)(REG_P2), R15 ADCQ (64)(REG_P2), AX ADCQ (72)(REG_P2), BX ADCQ (80)(REG_P2), CX MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ AX, (64)(REG_P3) MOVQ BX, (72)(REG_P3) MOVQ CX, (80)(REG_P3) MOVQ (88)(REG_P1), AX ADCQ (88)(REG_P2), AX MOVQ AX, (88)(REG_P3) MOVQ (96)(REG_P1), R8 MOVQ (104)(REG_P1), R9 MOVQ (112)(REG_P1), R10 MOVQ (120)(REG_P1), R11 MOVQ (128)(REG_P1), R12 MOVQ (136)(REG_P1), R13 MOVQ (144)(REG_P1), R14 MOVQ (152)(REG_P1), R15 MOVQ (160)(REG_P1), AX MOVQ (168)(REG_P1), BX MOVQ (176)(REG_P1), CX MOVQ (184)(REG_P1), DI ADCQ (96)(REG_P2), R8 ADCQ (104)(REG_P2), R9 ADCQ (112)(REG_P2), R10 ADCQ (120)(REG_P2), R11 ADCQ (128)(REG_P2), R12 ADCQ (136)(REG_P2), R13 ADCQ (144)(REG_P2), R14 ADCQ (152)(REG_P2), R15 ADCQ (160)(REG_P2), AX ADCQ (168)(REG_P2), BX ADCQ (176)(REG_P2), CX ADCQ (184)(REG_P2), DI MOVQ R8, (96)(REG_P3) MOVQ R9, (104)(REG_P3) MOVQ R10, (112)(REG_P3) MOVQ R11, (120)(REG_P3) MOVQ R12, (128)(REG_P3) MOVQ R13, (136)(REG_P3) MOVQ R14, (144)(REG_P3) MOVQ R15, (152)(REG_P3) MOVQ AX, (160)(REG_P3) MOVQ BX, (168)(REG_P3) MOVQ CX, (176)(REG_P3) MOVQ DI, (184)(REG_P3) RET TEXT ·fp751X2SubLazy(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), AX MOVQ (72)(REG_P1), BX MOVQ (80)(REG_P1), CX SUBQ (REG_P2), R8 SBBQ (8)(REG_P2), R9 SBBQ (16)(REG_P2), R10 SBBQ (24)(REG_P2), R11 SBBQ (32)(REG_P2), R12 SBBQ (40)(REG_P2), R13 SBBQ (48)(REG_P2), R14 SBBQ (56)(REG_P2), R15 SBBQ (64)(REG_P2), AX SBBQ (72)(REG_P2), BX SBBQ (80)(REG_P2), CX MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ AX, (64)(REG_P3) MOVQ BX, (72)(REG_P3) MOVQ CX, (80)(REG_P3) MOVQ (88)(REG_P1), AX SBBQ (88)(REG_P2), AX MOVQ AX, (88)(REG_P3) MOVQ (96)(REG_P1), R8 MOVQ (104)(REG_P1), R9 MOVQ (112)(REG_P1), R10 MOVQ (120)(REG_P1), R11 MOVQ (128)(REG_P1), R12 MOVQ (136)(REG_P1), R13 MOVQ (144)(REG_P1), R14 MOVQ (152)(REG_P1), R15 MOVQ (160)(REG_P1), AX MOVQ (168)(REG_P1), BX MOVQ (176)(REG_P1), CX MOVQ (184)(REG_P1), DI SBBQ (96)(REG_P2), R8 SBBQ (104)(REG_P2), R9 SBBQ (112)(REG_P2), R10 SBBQ (120)(REG_P2), R11 SBBQ (128)(REG_P2), R12 SBBQ (136)(REG_P2), R13 SBBQ (144)(REG_P2), R14 SBBQ (152)(REG_P2), R15 SBBQ (160)(REG_P2), AX SBBQ (168)(REG_P2), BX SBBQ (176)(REG_P2), CX SBBQ (184)(REG_P2), DI MOVQ R8, (96)(REG_P3) MOVQ R9, (104)(REG_P3) MOVQ R10, (112)(REG_P3) MOVQ R11, (120)(REG_P3) MOVQ R12, (128)(REG_P3) MOVQ R13, (136)(REG_P3) MOVQ R14, (144)(REG_P3) MOVQ R15, (152)(REG_P3) MOVQ AX, (160)(REG_P3) MOVQ BX, (168)(REG_P3) MOVQ CX, (176)(REG_P3) MOVQ DI, (184)(REG_P3) // Now the carry flag is 1 if x-y < 0. If so, add p*2^768. MOVQ $0, AX SBBQ $0, AX // Load p into registers: MOVQ P751_0, R8 // P751_{1,2,3,4} = P751_0, so reuse R8 MOVQ P751_5, R9 MOVQ P751_6, R10 MOVQ P751_7, R11 MOVQ P751_8, R12 MOVQ P751_9, R13 MOVQ P751_10, R14 MOVQ P751_11, R15 ANDQ AX, R8 ANDQ AX, R9 ANDQ AX, R10 ANDQ AX, R11 ANDQ AX, R12 ANDQ AX, R13 ANDQ AX, R14 ANDQ AX, R15 ADDQ R8, (96 )(REG_P3) ADCQ R8, (96+ 8)(REG_P3) ADCQ R8, (96+16)(REG_P3) ADCQ R8, (96+24)(REG_P3) ADCQ R8, (96+32)(REG_P3) ADCQ R9, (96+40)(REG_P3) ADCQ R10, (96+48)(REG_P3) ADCQ R11, (96+56)(REG_P3) ADCQ R12, (96+64)(REG_P3) ADCQ R13, (96+72)(REG_P3) ADCQ R14, (96+80)(REG_P3) ADCQ R15, (96+88)(REG_P3) RET golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p751/arith_amd64_test.go000066400000000000000000000044161343600534300260160ustar00rootroot00000000000000// +build amd64,!noasm package p751 import ( . "github.com/cloudflare/sidh/internal/isogeny" cpu "github.com/cloudflare/sidh/internal/utils" "reflect" "testing" "testing/quick" ) type OptimFlag uint const ( // Indicates that optimisation which uses MUL instruction should be used kUse_MUL OptimFlag = 1 << 0 // Indicates that optimisation which uses MULX instruction should be used kUse_MULX = 1 << 1 // Indicates that optimisation which uses MULX, ADOX and ADCX instructions should be used kUse_MULXandADxX = 1 << 2 ) func resetCpuFeatures() { HasBMI2 = cpu.X86.HasBMI2 HasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX } // Utility function used for testing REDC implementations. Tests caller provided // redcFunc against redc() func testRedc(t *testing.T, f1, f2 OptimFlag) { doRedcTest := func(aRR FpElementX2) bool { defer resetCpuFeatures() var resRedcF1, resRedcF2 FpElement var aRRcpy = aRR // Compute redc with first implementation HasBMI2 = (kUse_MULX & f1) == kUse_MULX HasADXandBMI2 = (kUse_MULXandADxX & f1) == kUse_MULXandADxX fp751MontgomeryReduce(&resRedcF1, &aRR) // Compute redc with second implementation HasBMI2 = (kUse_MULX & f2) == kUse_MULX HasADXandBMI2 = (kUse_MULXandADxX & f2) == kUse_MULXandADxX fp751MontgomeryReduce(&resRedcF2, &aRRcpy) // Compare results return reflect.DeepEqual(resRedcF2, resRedcF1) } if err := quick.Check(doRedcTest, quickCheckConfig); err != nil { t.Error(err) } } // Ensures correctness of Montgomery reduction implementation which uses MULX func TestRedcWithMULX(t *testing.T) { defer resetCpuFeatures() if !HasBMI2 { t.Skip("MULX not supported by the platform") } testRedc(t, kUse_MULX, kUse_MUL) } // Ensures correctness of Montgomery reduction implementation which uses MULX // and ADCX/ADOX. func TestRedcWithMULXADxX(t *testing.T) { defer resetCpuFeatures() if !HasADXandBMI2 { t.Skip("MULX, ADCX and ADOX not supported by the platform") } testRedc(t, kUse_MULXandADxX, kUse_MUL) } // Ensures correctness of Montgomery reduction implementation which uses MULX // and ADCX/ADOX. func TestRedcWithMULXADxXAgainstMULX(t *testing.T) { defer resetCpuFeatures() if !HasADXandBMI2 { t.Skip("MULX, ADCX and ADOX not supported by the platform") } testRedc(t, kUse_MULXandADxX, kUse_MULX) } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p751/arith_arm64.s000066400000000000000000000631311343600534300246310ustar00rootroot00000000000000// +build arm64,!noasm #include "textflag.h" TEXT ·fp751ConditionalSwap(SB), NOSPLIT, $0-17 MOVD x+0(FP), R0 MOVD y+8(FP), R1 MOVB choice+16(FP), R2 // Set flags // If choice is not 0 or 1, this implementation will swap completely CMP $0, R2 LDP 0(R0), (R3, R4) LDP 0(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 0(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 0(R1) LDP 16(R0), (R3, R4) LDP 16(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 16(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 16(R1) LDP 32(R0), (R3, R4) LDP 32(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 32(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 32(R1) LDP 48(R0), (R3, R4) LDP 48(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 48(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 48(R1) LDP 64(R0), (R3, R4) LDP 64(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 64(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 64(R1) LDP 80(R0), (R3, R4) LDP 80(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 80(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 80(R1) RET TEXT ·fp751AddReduced(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load first summand into R3-R14 // Add first summand and second summand and store result in R3-R14 LDP 0(R0), (R3, R4) LDP 0(R1), (R15, R16) LDP 16(R0), (R5, R6) LDP 16(R1), (R17, R19) ADDS R15, R3 ADCS R16, R4 ADCS R17, R5 ADCS R19, R6 LDP 32(R0), (R7, R8) LDP 32(R1), (R15, R16) LDP 48(R0), (R9, R10) LDP 48(R1), (R17, R19) ADCS R15, R7 ADCS R16, R8 ADCS R17, R9 ADCS R19, R10 LDP 64(R0), (R11, R12) LDP 64(R1), (R15, R16) LDP 80(R0), (R13, R14) LDP 80(R1), (R17, R19) ADCS R15, R11 ADCS R16, R12 ADCS R17, R13 ADC R19, R14 // Subtract 2 * p751 in R15-R24 from the result in R3-R14 LDP ·p751x2+0(SB), (R15, R16) SUBS R15, R3 SBCS R16, R4 LDP ·p751x2+40(SB), (R17, R19) SBCS R16, R5 SBCS R16, R6 SBCS R16, R7 LDP ·p751x2+56(SB), (R20, R21) SBCS R17, R8 SBCS R19, R9 LDP ·p751x2+72(SB), (R22, R23) SBCS R20, R10 SBCS R21, R11 MOVD ·p751x2+88(SB), R24 SBCS R22, R12 SBCS R23, R13 SBCS R24, R14 SBC ZR, ZR, R25 // If x + y - 2 * p751 < 0, R25 is 1 and 2 * p751 should be added AND R25, R15 AND R25, R16 AND R25, R17 AND R25, R19 AND R25, R20 AND R25, R21 AND R25, R22 AND R25, R23 AND R25, R24 ADDS R15, R3 ADCS R16, R4 STP (R3, R4), 0(R2) ADCS R16, R5 ADCS R16, R6 STP (R5, R6), 16(R2) ADCS R16, R7 ADCS R17, R8 STP (R7, R8), 32(R2) ADCS R19, R9 ADCS R20, R10 STP (R9, R10), 48(R2) ADCS R21, R11 ADCS R22, R12 STP (R11, R12), 64(R2) ADCS R23, R13 ADC R24, R14 STP (R13, R14), 80(R2) RET TEXT ·fp751SubReduced(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load x into R3-R14 // Subtract y from x and store result in R3-R14 LDP 0(R0), (R3, R4) LDP 0(R1), (R15, R16) LDP 16(R0), (R5, R6) LDP 16(R1), (R17, R19) SUBS R15, R3 SBCS R16, R4 SBCS R17, R5 SBCS R19, R6 LDP 32(R0), (R7, R8) LDP 32(R1), (R15, R16) LDP 48(R0), (R9, R10) LDP 48(R1), (R17, R19) SBCS R15, R7 SBCS R16, R8 SBCS R17, R9 SBCS R19, R10 LDP 64(R0), (R11, R12) LDP 64(R1), (R15, R16) LDP 80(R0), (R13, R14) LDP 80(R1), (R17, R19) SBCS R15, R11 SBCS R16, R12 SBCS R17, R13 SBCS R19, R14 SBC ZR, ZR, R15 // If x - y < 0, R15 is 1 and 2 * p751 should be added LDP ·p751x2+0(SB), (R16, R17) AND R15, R16 AND R15, R17 LDP ·p751x2+40(SB), (R19, R20) AND R15, R19 AND R15, R20 ADDS R16, R3 ADCS R17, R4 STP (R3, R4), 0(R2) ADCS R17, R5 ADCS R17, R6 STP (R5, R6), 16(R2) ADCS R17, R7 ADCS R19, R8 STP (R7, R8), 32(R2) ADCS R20, R9 LDP ·p751x2+56(SB), (R16, R17) AND R15, R16 AND R15, R17 LDP ·p751x2+72(SB), (R19, R20) AND R15, R19 AND R15, R20 ADCS R16, R10 STP (R9, R10), 48(R2) ADCS R17, R11 ADCS R19, R12 STP (R11, R12), 64(R2) ADCS R20, R13 MOVD ·p751x2+88(SB), R16 AND R15, R16 ADC R16, R14 STP (R13, R14), 80(R2) RET TEXT ·fp751AddLazy(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load first summand into R3-R14 // Add first summand and second summand and store result in R3-R14 LDP 0(R0), (R3, R4) LDP 0(R1), (R15, R16) LDP 16(R0), (R5, R6) LDP 16(R1), (R17, R19) ADDS R15, R3 ADCS R16, R4 STP (R3, R4), 0(R2) ADCS R17, R5 ADCS R19, R6 STP (R5, R6), 16(R2) LDP 32(R0), (R7, R8) LDP 32(R1), (R15, R16) LDP 48(R0), (R9, R10) LDP 48(R1), (R17, R19) ADCS R15, R7 ADCS R16, R8 STP (R7, R8), 32(R2) ADCS R17, R9 ADCS R19, R10 STP (R9, R10), 48(R2) LDP 64(R0), (R11, R12) LDP 64(R1), (R15, R16) LDP 80(R0), (R13, R14) LDP 80(R1), (R17, R19) ADCS R15, R11 ADCS R16, R12 STP (R11, R12), 64(R2) ADCS R17, R13 ADC R19, R14 STP (R13, R14), 80(R2) RET TEXT ·fp751X2AddLazy(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 LDP 0(R0), (R3, R4) LDP 0(R1), (R15, R16) LDP 16(R0), (R5, R6) LDP 16(R1), (R17, R19) ADDS R15, R3 ADCS R16, R4 STP (R3, R4), 0(R2) ADCS R17, R5 ADCS R19, R6 STP (R5, R6), 16(R2) LDP 32(R0), (R7, R8) LDP 32(R1), (R15, R16) LDP 48(R0), (R9, R10) LDP 48(R1), (R17, R19) ADCS R15, R7 ADCS R16, R8 STP (R7, R8), 32(R2) ADCS R17, R9 ADCS R19, R10 STP (R9, R10), 48(R2) LDP 64(R0), (R11, R12) LDP 64(R1), (R15, R16) LDP 80(R0), (R13, R14) LDP 80(R1), (R17, R19) ADCS R15, R11 ADCS R16, R12 STP (R11, R12), 64(R2) ADCS R17, R13 ADCS R19, R14 STP (R13, R14), 80(R2) LDP 96(R0), (R3, R4) LDP 96(R1), (R15, R16) LDP 112(R0), (R5, R6) LDP 112(R1), (R17, R19) ADCS R15, R3 ADCS R16, R4 STP (R3, R4), 96(R2) ADCS R17, R5 ADCS R19, R6 STP (R5, R6), 112(R2) LDP 128(R0), (R7, R8) LDP 128(R1), (R15, R16) LDP 144(R0), (R9, R10) LDP 144(R1), (R17, R19) ADCS R15, R7 ADCS R16, R8 STP (R7, R8), 128(R2) ADCS R17, R9 ADCS R19, R10 STP (R9, R10), 144(R2) LDP 160(R0), (R11, R12) LDP 160(R1), (R15, R16) LDP 176(R0), (R13, R14) LDP 176(R1), (R17, R19) ADCS R15, R11 ADCS R16, R12 STP (R11, R12), 160(R2) ADCS R17, R13 ADC R19, R14 STP (R13, R14), 176(R2) RET TEXT ·fp751X2SubLazy(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 LDP 0(R0), (R3, R4) LDP 0(R1), (R15, R16) LDP 16(R0), (R5, R6) LDP 16(R1), (R17, R19) SUBS R15, R3 SBCS R16, R4 STP (R3, R4), 0(R2) SBCS R17, R5 SBCS R19, R6 STP (R5, R6), 16(R2) LDP 32(R0), (R7, R8) LDP 32(R1), (R15, R16) LDP 48(R0), (R9, R10) LDP 48(R1), (R17, R19) SBCS R15, R7 SBCS R16, R8 STP (R7, R8), 32(R2) SBCS R17, R9 SBCS R19, R10 STP (R9, R10), 48(R2) LDP 64(R0), (R11, R12) LDP 64(R1), (R15, R16) LDP 80(R0), (R13, R14) LDP 80(R1), (R17, R19) SBCS R15, R11 SBCS R16, R12 STP (R11, R12), 64(R2) SBCS R17, R13 SBCS R19, R14 STP (R13, R14), 80(R2) LDP 96(R0), (R3, R4) LDP 96(R1), (R15, R16) LDP 112(R0), (R5, R6) LDP 112(R1), (R17, R19) SBCS R15, R3 SBCS R16, R4 SBCS R17, R5 SBCS R19, R6 LDP 128(R0), (R7, R8) LDP 128(R1), (R15, R16) LDP 144(R0), (R9, R10) LDP 144(R1), (R17, R19) SBCS R15, R7 SBCS R16, R8 SBCS R17, R9 SBCS R19, R10 LDP 160(R0), (R11, R12) LDP 160(R1), (R15, R16) LDP 176(R0), (R13, R14) LDP 176(R1), (R17, R19) SBCS R15, R11 SBCS R16, R12 SBCS R17, R13 SBCS R19, R14 SBC ZR, ZR, R15 // If x - y < 0, R15 is 1 and p751 should be added MOVD ·p751+0(SB), R20 AND R15, R20 LDP ·p751+40(SB), (R16, R17) ADDS R20, R3 ADCS R20, R4 STP (R3, R4), 96(R2) ADCS R20, R5 ADCS R20, R6 STP (R5, R6), 112(R2) ADCS R20, R7 LDP ·p751+56(SB), (R19, R20) AND R15, R16 AND R15, R17 ADCS R16, R8 STP (R7, R8), 128(R2) ADCS R17, R9 LDP ·p751+72(SB), (R16, R17) AND R15, R19 AND R15, R20 ADCS R19, R10 STP (R9, R10), 144(R2) ADCS R20, R11 MOVD ·p751+88(SB), R19 AND R15, R16 AND R15, R17 ADCS R16, R12 STP (R11, R12), 160(R2) ADCS R17, R13 AND R15, R19 ADC R19, R14 STP (R13, R14), 176(R2) RET // Expects that X0*Y0 is already in Z0(low),Z3(high) and X0*Y1 in Z1(low),Z2(high) // Z0 is not actually touched // Result of (X0-X2) * (Y0-Y2) will be in Z0-Z5 // Inputs remain intact #define mul192x192comba(X0, X1, X2, Y0, Y1, Y2, Z0, Z1, Z2, Z3, Z4, Z5, T0, T1, T2, T3) \ MUL X1, Y0, T2 \ UMULH X1, Y0, T3 \ \ ADDS Z3, Z1 \ ADCS ZR, Z2 \ ADC ZR, ZR, Z3 \ \ MUL X0, Y2, T0 \ UMULH X0, Y2, T1 \ \ ADDS T2, Z1 \ ADCS T3, Z2 \ ADC ZR, Z3 \ \ MUL X1, Y1, T2 \ UMULH X1, Y1, T3 \ \ ADDS T0, Z2 \ ADCS T1, Z3 \ ADC ZR, ZR, Z4 \ \ MUL X2, Y0, T0 \ UMULH X2, Y0, T1 \ \ ADDS T2, Z2 \ ADCS T3, Z3 \ ADC ZR, Z4 \ \ MUL X1, Y2, T2 \ UMULH X1, Y2, T3 \ \ ADDS T0, Z2 \ ADCS T1, Z3 \ ADC ZR, Z4 \ \ MUL X2, Y1, T0 \ UMULH X2, Y1, T1 \ \ ADDS T2, Z3 \ ADCS T3, Z4 \ ADC ZR, ZR, Z5 \ \ MUL X2, Y2, T2 \ UMULH X2, Y2, T3 \ \ ADDS T0, Z3 \ ADCS T1, Z4 \ ADC ZR, Z5 \ \ ADDS T2, Z4 \ ADC T3, Z5 // Expects that X points to (X4-X6), Y to (Y4-Y6) // Result of (X0-X5) * (Y0-Y5) will be in (0(Z), 8(Z), 16(Z), T0-T8) // Inputs get overwritten #define mul384x384karatsuba(X, Y, Z, X0, X1, X2, X3, X4, X5, Y0, Y1, Y2, Y3, Y4, Y5, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)\ ADDS X0, X3 \ // xH + xL, destroys xH ADCS X1, X4 \ ADCS X2, X5 \ ADC ZR, ZR, T10 \ \ ADDS Y0, Y3 \ // yH + yL, destroys yH ADCS Y1, Y4 \ ADCS Y2, Y5 \ ADC ZR, ZR, T6 \ \ SUB T10, ZR, T7 \ SUB T6, ZR, T8 \ AND T6, T10 \ // combined carry \ AND T7, Y3, T0 \ // masked(yH + yL) AND T7, Y4, T1 \ AND T7, Y5, T2 \ \ AND T8, X3, T3 \ // masked(xH + xL) AND T8, X4, T4 \ AND T8, X5, T5 \ \ ADDS T3, T0 \ ADCS T4, T1 \ STP (T0, T1), 0+Z \ \ MUL X3, Y3, T0 \ MUL X3, Y4, T1 \ \ ADCS T5, T2 \ MOVD T2, 16+Z \ \ UMULH X3, Y4, T2 \ UMULH X3, Y3, T3 \ \ ADC ZR, T10 \ \ // (xH + xL) * (yH + yL) mul192x192comba(X3, X4, X5, Y3, Y4, Y5, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)\ \ MUL X0, Y0, X3 \ LDP 0+Z, (T6, T7) \ MOVD 16+Z, T8 \ \ UMULH X0, Y0, Y3 \ ADDS T6, T3 \ ADCS T7, T4 \ MUL X0, Y1, X4 \ ADCS T8, T5 \ ADC ZR, T10 \ UMULH X0, Y1, X5 \ \ // xL * yL mul192x192comba(X0, X1, X2, Y0, Y1, Y2, X3, X4, X5, Y3, Y4, Y5, T6, T7, T8, T9)\ \ STP (X3, X4), 0+Z \ MOVD X5, 16+Z \ \ SUBS X3, T0 \ // (xH + xL) * (yH + yL) - xL * yL SBCS X4, T1 \ LDP 0+X, (X3, X4) \ SBCS X5, T2 \ MOVD 16+X, X5 \ SBCS Y3, T3 \ SBCS Y4, T4 \ SBCS Y5, T5 \ SBC ZR, T10 \ \ ADDS Y3, T0 \ // ((xH + xL) * (yH + yL) - xL * yL) * 2^192 + xL * yL ADCS Y4, T1 \ LDP 0+Y, (Y3, Y4) \ MUL X3, Y3, X0 \ ADCS Y5, T2 \ UMULH X3, Y3, Y0 \ MOVD 16+Y, Y5 \ MUL X3, Y4, X1 \ ADCS ZR, T3 \ UMULH X3, Y4, X2 \ ADCS ZR, T4 \ ADCS ZR, T5 \ ADC ZR, T10 \ \ // xH * yH, overwrite xLow, yLow mul192x192comba(X3, X4, X5, Y3, Y4, Y5, X0, X1, X2, Y0, Y1, Y2, T6, T7, T8, T9)\ \ SUBS X0, T0 \ // ((xH + xL) * (yH + yL) - xL * yL - xH * yH) SBCS X1, T1 \ SBCS X2, T2 \ SBCS Y0, T3 \ SBCS Y1, T4 \ SBCS Y2, T5 \ SBC ZR, T10 \ \ ADDS X0, T3 \ ADCS X1, T4 \ ADCS X2, T5 \ ADCS T10, Y0, T6 \ ADCS ZR, Y1, T7 \ ADC ZR, Y2, T8 TEXT ·fp751Mul(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load xL in R3-R8, xH in R9-R14 // (xH + xL) in R3-R8, destroys xH LDP 0(R0), (R3, R4) LDP 48(R0), (R9, R10) ADDS R9, R3 ADCS R10, R4 LDP 16(R0), (R5, R6) LDP 64(R0), (R11, R12) ADCS R11, R5 ADCS R12, R6 LDP 32(R0), (R7, R8) LDP 80(R0), (R13, R14) ADCS R13, R7 ADCS R14, R8 ADC ZR, ZR, R22 // Load yL in R9-R14, yH in R15-21 // (yH + yL) in R9-R14, destroys yH LDP 0(R1), (R9, R10) LDP 48(R1), (R15, R16) ADDS R15, R9 ADCS R16, R10 LDP 16(R1), (R11, R12) LDP 64(R1), (R17, R19) ADCS R17, R11 ADCS R19, R12 LDP 32(R1), (R13, R14) LDP 80(R1), (R20, R21) ADCS R20, R13 ADCS R21, R14 ADC ZR, ZR, R23 // Compute masks and combined carry SUB R22, ZR, R24 SUB R23, ZR, R25 AND R23, R22 // Store xH, yH in z so mul384x384karatsuba can retrieve them from memory // It doesn't have enough registers // Meanwhile computed masked(xH + xL) in R15-R21 STP (R6, R7), 0(R2) AND R25, R3, R15 AND R25, R4, R16 STP (R8, R12), 16(R2) AND R25, R5, R17 AND R25, R6, R19 STP (R13, R14), 32(R2) AND R25, R7, R20 AND R25, R8, R21 // Masked(xH + xL) + masked(yH + yL) in R15-R21 // Store intermediate values in z AND R24, R9, R25 AND R24, R10, R26 ADDS R25, R15 ADCS R26, R16 STP (R15, R16), 96(R2) AND R24, R11, R25 AND R24, R12, R26 ADCS R25, R17 ADCS R26, R19 STP (R17, R19), 112(R2) AND R24, R13, R25 AND R24, R14, R26 ADCS R25, R20 ADCS R26, R21 STP (R20, R21), 128(R2) // Store carry in R29 so it can remain there ADC ZR, R22, R29 // (xH + xL) * (yH + yL) mul384x384karatsuba(0(R2), 24(R2), 48(R2), R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R19, R20, R21, R22, R23, R24, R25, R26) // Load masked(xH + xL) + masked(yH + yL) and add that to its top half // Store the result back in z STP (R15, R16), 72(R2) LDP 96(R2), (R3, R4) ADDS R3, R19 STP (R17, R19), 88(R2) ADCS R4, R20 LDP 112(R2), (R5, R6) ADCS R5, R21 STP (R20, R21), 104(R2) ADCS R6, R22 LDP 128(R2), (R7, R8) ADCS R7, R23 STP (R22, R23), 120(R2) ADCS R8, R24 MOVD R24, 136(R2) ADC ZR, R29 // Load xL, yL LDP 0(R0), (R3, R4) LDP 16(R0), (R5, R6) LDP 32(R0), (R7, R8) LDP 0(R1), (R9, R10) LDP 16(R1), (R11, R12) LDP 32(R1), (R13, R14) // xL * yL mul384x384karatsuba(24(R0), 24(R1), 0(R2), R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R19, R20, R21, R22, R23, R24, R25, R26) // (xH + xL) * (yH + yL) - xL * yL in R3-R14 LDP 0(R2), (R12, R13) LDP 48(R2), (R3, R4) SUBS R12, R3 LDP 64(R2), (R5, R6) MOVD 16(R2), R14 SBCS R13, R4 SBCS R14, R5 LDP 80(R2), (R7, R8) SBCS R15, R6 SBCS R16, R7 LDP 96(R2), (R9, R10) SBCS R17, R8 SBCS R19, R9 LDP 112(R2), (R11, R12) SBCS R20, R10 SBCS R21, R11 LDP 128(R2), (R13, R14) SBCS R22, R12 SBCS R23, R13 SBCS R24, R14 SBC ZR, R29 STP (R15, R16), 24(R2) MOVD R17, 40(R2) // ((xH + xL) * (yH + yL) - xL * yL) * 2^384 + xL * yL and store back in z ADDS R19, R3 ADCS R20, R4 STP (R3, R4), 48(R2) ADCS R21, R5 ADCS R22, R6 STP (R5, R6), 64(R2) ADCS R23, R7 ADCS R24, R8 STP (R7, R8), 80(R2) ADCS ZR, R9 ADCS ZR, R10 STP (R9, R10), 96(R2) ADCS ZR, R11 ADCS ZR, R12 STP (R11, R12), 112(R2) ADCS ZR, R13 ADCS ZR, R14 STP (R13, R14), 128(R2) ADC ZR, R29 // Load xH, yH LDP 48(R0), (R3, R4) LDP 64(R0), (R5, R6) LDP 80(R0), (R7, R8) LDP 48(R1), (R9, R10) LDP 64(R1), (R11, R12) LDP 80(R1), (R13, R14) // xH * yH mul384x384karatsuba(72(R0), 72(R1), 144(R2), R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R19, R20, R21, R22, R23, R24, R25, R26) LDP 144(R2), (R12, R13) MOVD 160(R2), R14 // (xH + xL) * (yH + yL) - xL * yL - xH * yH in R3-R14 // Store lower half in z, that's done LDP 48(R2), (R3, R4) SUBS R12, R3 LDP 64(R2), (R5, R6) SBCS R13, R4 SBCS R14, R5 LDP 80(R2), (R7, R8) SBCS R15, R6 SBCS R16, R7 LDP 96(R2), (R9, R10) SBCS R17, R8 SBCS R19, R9 LDP 112(R2), (R11, R12) SBCS R20, R10 SBCS R21, R11 LDP 128(R2), (R13, R14) SBCS R22, R12 SBCS R23, R13 STP (R3, R4), 48(R2) SBCS R24, R14 STP (R5, R6), 64(R2) SBC ZR, R29 STP (R7, R8), 80(R2) // (xH * yH) * 2^768 + ((xH + xL) * (yH + yL) - xL * yL - xH * yH) * 2^384 + xL * yL // Store remaining limbs in z LDP 144(R2), (R3, R4) MOVD 160(R2), R5 ADDS R3, R9 ADCS R4, R10 STP (R9, R10), 96(R2) ADCS R5, R11 ADCS R15, R12 STP (R11, R12), 112(R2) ADCS R16, R13 ADCS R17, R14 STP (R13, R14), 128(R2) ADCS R29, R19 ADCS ZR, R20 STP (R19, R20), 144(R2) ADCS ZR, R21 ADCS ZR, R22 STP (R21, R22), 160(R2) ADCS ZR, R23 ADC ZR, R24 STP (R23, R24), 176(R2) RET TEXT ·fp751MontgomeryReduce(SB), NOSPLIT, $0-16 MOVD z+0(FP), R0 MOVD x+8(FP), R1 // Load p751+1 in R14-R17, R29, R19-R20, spread over arithmetic LDP ·p751p1+40(SB), (R14, R15) // z0-z11 will be R2-R13 // Load x0-x4 to z0-z4 and x5, spread over arithmetic LDP 0(R1), (R2, R3) // x5 iteration MUL R2, R14, R22 LDP 32(R1), (R6, R21) UMULH R2, R14, R23 ADDS R21, R22, R7 // Set z5 ADC ZR, R23, R25 // x6 iteration MUL R2, R15, R22 MOVD 48(R1), R21 UMULH R2, R15, R23 ADDS R22, R25 ADC R23, ZR, R26 MUL R3, R14, R22 LDP ·p751p1+56(SB), (R16, R17) UMULH R3, R14, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, ZR, R24 ADDS R21, R25, R8 // Set z6 ADCS ZR, R26 ADC ZR, R24 // x7 iteration MUL R2, R16, R22 MOVD 56(R1), R21 UMULH R2, R16, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, ZR, R25 MUL R3, R15, R22 LDP 16(R1), (R4, R5) UMULH R3, R15, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R4, R14, R22 LDP ·p751p1+72(SB), (R29, R19) UMULH R4, R14, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 ADDS R21, R26, R9 // Set z7 ADCS ZR, R24 ADC ZR, R25 // x8 iteration MUL R2, R17, R22 MOVD 64(R1), R21 UMULH R2, R17, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, ZR, R26 MUL R3, R16, R22 MOVD ·p751p1+88(SB), R20 UMULH R3, R16, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R4, R15, R22 UMULH R4, R15, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R5, R14, R22 UMULH R5, R14, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 ADDS R24, R21, R10 // Set z8 ADCS ZR, R25 ADC ZR, R26 // x9 iteration MUL R2, R29, R22 MOVD 72(R1), R21 UMULH R2, R29, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, ZR, R24 MUL R3, R17, R22 UMULH R3, R17, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R4, R16, R22 UMULH R4, R16, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R5, R15, R22 UMULH R5, R15, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R6, R14, R22 UMULH R6, R14, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 ADDS R21, R25, R11 // Set z9 ADCS ZR, R26 ADC ZR, R24 // x10 iteration MUL R2, R19, R22 MOVD 80(R1), R21 UMULH R2, R19, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, ZR, R25 MUL R3, R29, R22 UMULH R3, R29, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R4, R17, R22 UMULH R4, R17, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R5, R16, R22 UMULH R5, R16, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R6, R15, R22 UMULH R6, R15, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R7, R14, R22 UMULH R7, R14, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 ADDS R21, R26, R12 // Set z10 ADCS ZR, R24 ADC ZR, R25 // x11 iteration MUL R2, R20, R22 MOVD 88(R1), R21 UMULH R2, R20, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, ZR, R26 MUL R3, R19, R22 UMULH R3, R19, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R4, R29, R22 UMULH R4, R29, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R5, R17, R22 UMULH R5, R17, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R6, R16, R22 UMULH R6, R16, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R7, R15, R22 UMULH R7, R15, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R8, R14, R22 UMULH R8, R14, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 ADDS R21, R24, R13 // Set z11 ADCS ZR, R25 ADC ZR, R26 // x12 iteration MUL R3, R20, R22 MOVD 96(R1), R21 UMULH R3, R20, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, ZR, R24 MUL R4, R19, R22 UMULH R4, R19, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R5, R29, R22 UMULH R5, R29, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R6, R17, R22 UMULH R6, R17, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R7, R16, R22 UMULH R7, R16, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R8, R15, R22 UMULH R8, R15, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R9, R14, R22 UMULH R9, R14, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 ADDS R21, R25, R2 // Set z0 ADCS ZR, R26 ADC ZR, R24 // x13 iteration MUL R4, R20, R22 MOVD 104(R1), R21 UMULH R4, R20, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, ZR, R25 MUL R5, R19, R22 UMULH R5, R19, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R6, R29, R22 UMULH R6, R29, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R7, R17, R22 UMULH R7, R17, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R8, R16, R22 UMULH R8, R16, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R9, R15, R22 UMULH R9, R15, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R10, R14, R22 UMULH R10, R14, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 ADDS R21, R26, R3 // Set z1 STP (R2, R3), 0(R0) ADCS ZR, R24 ADC ZR, R25 // x14 iteration MUL R5, R20, R22 MOVD 112(R1), R21 UMULH R5, R20, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, ZR, R26 MUL R6, R19, R22 UMULH R6, R19, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R7, R29, R22 UMULH R7, R29, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R8, R17, R22 UMULH R8, R17, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R9, R16, R22 UMULH R9, R16, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R10, R15, R22 UMULH R10, R15, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R11, R14, R22 UMULH R11, R14, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 ADDS R21, R24, R4 // Set z2 ADCS ZR, R25 ADC ZR, R26 // x15 iteration MUL R6, R20, R22 MOVD 120(R1), R21 UMULH R6, R20, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, ZR, R24 MUL R7, R19, R22 UMULH R7, R19, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R8, R29, R22 UMULH R8, R29, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R9, R17, R22 UMULH R9, R17, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R10, R16, R22 UMULH R10, R16, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R11, R15, R22 UMULH R11, R15, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R12, R14, R22 UMULH R12, R14, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 ADDS R21, R25, R5 // Set z3 STP (R4, R5), 16(R0) ADCS ZR, R26 ADC ZR, R24 // x16 iteration MUL R7, R20, R22 MOVD 128(R1), R21 UMULH R7, R20, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, ZR, R25 MUL R8, R19, R22 UMULH R8, R19, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R9, R29, R22 UMULH R9, R29, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R10, R17, R22 UMULH R10, R17, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R11, R16, R22 UMULH R11, R16, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R12, R15, R22 UMULH R12, R15, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R13, R14, R22 UMULH R13, R14, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 ADDS R21, R26, R6 // Set z4 ADCS ZR, R24 ADC ZR, R25 // x17 iteration MUL R8, R20, R22 MOVD 136(R1), R21 UMULH R8, R20, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, ZR, R26 MUL R9, R19, R22 UMULH R9, R19, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R10, R29, R22 UMULH R10, R29, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R11, R17, R22 UMULH R11, R17, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R12, R16, R22 UMULH R12, R16, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R13, R15, R22 UMULH R13, R15, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 ADDS R21, R24, R7 // Set z5 STP (R6, R7), 32(R0) ADCS ZR, R25 ADC ZR, R26 // x18 iteration MUL R9, R20, R22 MOVD 144(R1), R21 UMULH R9, R20, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, ZR, R24 MUL R10, R19, R22 UMULH R10, R19, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R11, R29, R22 UMULH R11, R29, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R12, R17, R22 UMULH R12, R17, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R13, R16, R22 UMULH R13, R16, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 ADDS R21, R25, R8 // Set z6 ADCS ZR, R26 ADC ZR, R24 // x19 iteration MUL R10, R20, R22 MOVD 152(R1), R21 UMULH R10, R20, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, ZR, R25 MUL R11, R19, R22 UMULH R11, R19, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R12, R29, R22 UMULH R12, R29, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R13, R17, R22 UMULH R13, R17, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 ADDS R21, R26, R9 // Set z7 STP (R8, R9), 48(R0) ADCS ZR, R24 ADC ZR, R25 // x20 iteration MUL R11, R20, R22 MOVD 160(R1), R21 UMULH R11, R20, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, ZR, R26 MUL R12, R19, R22 UMULH R12, R19, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R13, R29, R22 UMULH R13, R29, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 ADDS R21, R24, R10 // Set z8 ADCS ZR, R25 ADC ZR, R26 // x21 iteration MUL R12, R20, R22 MOVD 168(R1), R21 UMULH R12, R20, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, ZR, R24 MUL R13, R19, R22 UMULH R13, R19, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 ADDS R21, R25, R11 // Set z9 STP (R10, R11), 64(R0) ADCS ZR, R26 ADC ZR, R24 // x22 iteration MUL R13, R20, R22 MOVD 176(R1), R21 UMULH R13, R20, R23 ADDS R22, R26 ADC R23, R24 ADDS R21, R26, R12 // Set z10 MOVD 184(R1), R21 ADC R21, R24, R13 // Set z11 STP (R12, R13), 80(R0) RET TEXT ·fp751StrongReduce(SB), NOSPLIT, $0-8 MOVD x+0(FP), R0 // Keep x in R1-R12, p751 in R13-R21, subtract to R1-R12 MOVD ·p751+0(SB), R13 LDP 0(R0), (R1, R2) LDP 16(R0), (R3, R4) SUBS R13, R1 SBCS R13, R2 LDP 32(R0), (R5, R6) LDP ·p751+40(SB), (R14, R15) SBCS R13, R3 SBCS R13, R4 LDP 48(R0), (R7, R8) LDP ·p751+56(SB), (R16, R17) SBCS R13, R5 SBCS R14, R6 LDP 64(R0), (R9, R10) LDP ·p751+72(SB), (R19, R20) SBCS R15, R7 SBCS R16, R8 LDP 80(R0), (R11, R12) MOVD ·p751+88(SB), R21 SBCS R17, R9 SBCS R19, R10 SBCS R20, R11 SBCS R21, R12 SBC ZR, ZR, R22 // Mask with the borrow and add p751 AND R22, R13 AND R22, R14 AND R22, R15 AND R22, R16 AND R22, R17 AND R22, R19 AND R22, R20 AND R22, R21 ADDS R13, R1 ADCS R13, R2 STP (R1, R2), 0(R0) ADCS R13, R3 ADCS R13, R4 STP (R3, R4), 16(R0) ADCS R13, R5 ADCS R14, R6 STP (R5, R6), 32(R0) ADCS R15, R7 ADCS R16, R8 STP (R7, R8), 48(R0) ADCS R17, R9 ADCS R19, R10 STP (R9, R10), 64(R0) ADCS R20, R11 ADC R21, R12 STP (R11, R12), 80(R0) RET golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p751/arith_decl.go000066400000000000000000000022531343600534300247500ustar00rootroot00000000000000// +build amd64,!noasm arm64,!noasm package p751 import ( . "github.com/cloudflare/sidh/internal/isogeny" ) // If choice = 0, leave x,y unchanged. If choice = 1, set x,y = y,x. // If choice is neither 0 nor 1 then behaviour is undefined. // This function executes in constant time. //go:noescape func fp751ConditionalSwap(x, y *FpElement, choice uint8) // Compute z = x + y (mod p). //go:noescape func fp751AddReduced(z, x, y *FpElement) // Compute z = x - y (mod p). //go:noescape func fp751SubReduced(z, x, y *FpElement) // Compute z = x + y, without reducing mod p. //go:noescape func fp751AddLazy(z, x, y *FpElement) // Compute z = x + y, without reducing mod p. //go:noescape func fp751X2AddLazy(z, x, y *FpElementX2) // Compute z = x - y, without reducing mod p. //go:noescape func fp751X2SubLazy(z, x, y *FpElementX2) // Compute z = x * y. //go:noescape func fp751Mul(z *FpElementX2, x, y *FpElement) // Compute Montgomery reduction: set z = x * R^{-1} (mod 2*p). // It may destroy the input value. //go:noescape func fp751MontgomeryReduce(z *FpElement, x *FpElementX2) // Reduce a field element in [0, 2*p) to one in [0,p). //go:noescape func fp751StrongReduce(x *FpElement) golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p751/arith_generic.go000066400000000000000000000101271343600534300254540ustar00rootroot00000000000000// +build noasm !amd64,!arm64 package p751 import ( . "github.com/cloudflare/sidh/internal/arith" . "github.com/cloudflare/sidh/internal/isogeny" ) // Compute z = x + y (mod p). func fp751AddReduced(z, x, y *FpElement) { var carry uint64 // z=x+y % p751 for i := 0; i < NumWords; i++ { z[i], carry = Addc64(carry, x[i], y[i]) } // z = z - p751x2 carry = 0 for i := 0; i < NumWords; i++ { z[i], carry = Subc64(carry, z[i], p751x2[i]) } // z = z + p751x2 mask := uint64(0 - carry) carry = 0 for i := 0; i < NumWords; i++ { z[i], carry = Addc64(carry, z[i], p751x2[i]&mask) } } // Compute z = x - y (mod p). func fp751SubReduced(z, x, y *FpElement) { var borrow uint64 for i := 0; i < NumWords; i++ { z[i], borrow = Subc64(borrow, x[i], y[i]) } mask := uint64(0 - borrow) borrow = 0 for i := 0; i < NumWords; i++ { z[i], borrow = Addc64(borrow, z[i], p751x2[i]&mask) } } // Conditionally swaps bits in x and y in constant time. // mask indicates bits to be swaped (set bits are swapped) // For details see "Hackers Delight, 2.20" // // Implementation doesn't actually depend on a prime field. func fp751ConditionalSwap(x, y *FpElement, mask uint8) { var tmp, mask64 uint64 mask64 = 0 - uint64(mask) for i := 0; i < len(x); i++ { tmp = mask64 & (x[i] ^ y[i]) x[i] = tmp ^ x[i] y[i] = tmp ^ y[i] } } // Perform Montgomery reduction: set z = x R^{-1} (mod 2*p) // with R=2^768. Destroys the input value. func fp751MontgomeryReduce(z *FpElement, x *FpElementX2) { var carry, t, u, v uint64 var uv Uint128 var count int count = 5 // number of 0 digits in the least significat part of p751 + 1 for i := 0; i < NumWords; i++ { for j := 0; j < i; j++ { if j < (i - count + 1) { uv = Mul64(z[j], p751p1[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } } v, carry = Addc64(0, v, x[i]) u, carry = Addc64(carry, u, 0) t += carry z[i] = v v = u u = t t = 0 } for i := NumWords; i < 2*NumWords-1; i++ { if count > 0 { count-- } for j := i - NumWords + 1; j < NumWords; j++ { if j < (NumWords - count) { uv = Mul64(z[j], p751p1[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } } v, carry = Addc64(0, v, x[i]) u, carry = Addc64(carry, u, 0) t += carry z[i-NumWords] = v v = u u = t t = 0 } v, carry = Addc64(0, v, x[2*NumWords-1]) z[NumWords-1] = v } // Compute z = x * y. func fp751Mul(z *FpElementX2, x, y *FpElement) { var u, v, t uint64 var carry uint64 var uv Uint128 for i := uint64(0); i < NumWords; i++ { for j := uint64(0); j <= i; j++ { uv = Mul64(x[j], y[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } z[i] = v v = u u = t t = 0 } for i := NumWords; i < (2*NumWords)-1; i++ { for j := i - NumWords + 1; j < NumWords; j++ { uv = Mul64(x[j], y[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } z[i] = v v = u u = t t = 0 } z[2*NumWords-1] = v } // Compute z = x + y, without reducing mod p. func fp751AddLazy(z, x, y *FpElement) { var carry uint64 for i := 0; i < NumWords; i++ { z[i], carry = Addc64(carry, x[i], y[i]) } } // Compute z = x + y, without reducing mod p. func fp751X2AddLazy(z, x, y *FpElementX2) { var carry uint64 for i := 0; i < 2*NumWords; i++ { z[i], carry = Addc64(carry, x[i], y[i]) } } // Reduce a field element in [0, 2*p) to one in [0,p). func fp751StrongReduce(x *FpElement) { var borrow, mask uint64 for i := 0; i < NumWords; i++ { x[i], borrow = Subc64(borrow, x[i], p751[i]) } // Sets all bits if borrow = 1 mask = 0 - borrow borrow = 0 for i := 0; i < NumWords; i++ { x[i], borrow = Addc64(borrow, x[i], p751[i]&mask) } } // Compute z = x - y, without reducing mod p. func fp751X2SubLazy(z, x, y *FpElementX2) { var borrow, mask uint64 for i := 0; i < len(z); i++ { z[i], borrow = Subc64(borrow, x[i], y[i]) } // Sets all bits if borrow = 1 mask = 0 - borrow borrow = 0 for i := NumWords; i < len(z); i++ { z[i], borrow = Addc64(borrow, z[i], p751[i-NumWords]&mask) } } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p751/arith_test.go000066400000000000000000000202111343600534300250120ustar00rootroot00000000000000package p751 import ( . "github.com/cloudflare/sidh/internal/isogeny" "math/big" "testing" "testing/quick" ) func TestPrimeFieldElementToBigInt(t *testing.T) { // Chosen so that p < xR < 2p x := primeFieldElement{A: FpElement{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 140737488355328, }} // Computed using Sage: // sage: p = 2^372 * 3^239 - 1 // sage: R = 2^768 // sage: from_radix_64 = lambda xs: sum((xi * (2**64)**i for i,xi in enumerate(xs))) // sage: xR = from_radix_64([1]*11 + [2^47]) // sage: assert(p < xR) // sage: assert(xR < 2*p) // sage: (xR / R) % p xBig, _ := new(big.Int).SetString("4469946751055876387821312289373600189787971305258234719850789711074696941114031433609871105823930699680637820852699269802003300352597419024286385747737509380032982821081644521634652750355306547718505685107272222083450567982240", 10) if xBig.Cmp(toBigInt(&x.A)) != 0 { t.Error("Expected", xBig, "found", toBigInt(&x.A)) } } //------------------------------------------------------------------------------ // Extended Field //------------------------------------------------------------------------------ func TestOneFp2ToBytes(t *testing.T) { var x = P751_OneFp2 var xBytes [188]byte kCurveOps.Fp2ToBytes(xBytes[:], &x) if xBytes[0] != 1 { t.Error("Expected 1, got", xBytes[0]) } for i := 1; i < 188; i++ { if xBytes[i] != 0 { t.Error("Expected 0, got", xBytes[0]) } } } func TestFp2ElementToBytesRoundTrip(t *testing.T) { roundTrips := func(x GeneratedTestParams) bool { var xBytes [188]byte var xPrime Fp2Element kCurveOps.Fp2ToBytes(xBytes[:], &x.ExtElem) kCurveOps.Fp2FromBytes(&xPrime, xBytes[:]) return VartimeEqFp2(&xPrime, &x.ExtElem) } if err := quick.Check(roundTrips, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementMulDistributesOverAdd(t *testing.T) { mulDistributesOverAdd := func(x, y, z GeneratedTestParams) bool { // Compute t1 = (x+y)*z t1 := new(Fp2Element) kFieldOps.Add(t1, &x.ExtElem, &y.ExtElem) kFieldOps.Mul(t1, t1, &z.ExtElem) // Compute t2 = x*z + y*z t2 := new(Fp2Element) t3 := new(Fp2Element) kFieldOps.Mul(t2, &x.ExtElem, &z.ExtElem) kFieldOps.Mul(t3, &y.ExtElem, &z.ExtElem) kFieldOps.Add(t2, t2, t3) return VartimeEqFp2(t1, t2) } if err := quick.Check(mulDistributesOverAdd, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementMulIsAssociative(t *testing.T) { isAssociative := func(x, y, z GeneratedTestParams) bool { // Compute t1 = (x*y)*z t1 := new(Fp2Element) kFieldOps.Mul(t1, &x.ExtElem, &y.ExtElem) kFieldOps.Mul(t1, t1, &z.ExtElem) // Compute t2 = (y*z)*x t2 := new(Fp2Element) kFieldOps.Mul(t2, &y.ExtElem, &z.ExtElem) kFieldOps.Mul(t2, t2, &x.ExtElem) return VartimeEqFp2(t1, t2) } if err := quick.Check(isAssociative, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementSquareMatchesMul(t *testing.T) { sqrMatchesMul := func(x GeneratedTestParams) bool { // Compute t1 = (x*x) t1 := new(Fp2Element) kFieldOps.Mul(t1, &x.ExtElem, &x.ExtElem) // Compute t2 = x^2 t2 := new(Fp2Element) kFieldOps.Square(t2, &x.ExtElem) return VartimeEqFp2(t1, t2) } if err := quick.Check(sqrMatchesMul, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementInv(t *testing.T) { inverseIsCorrect := func(x GeneratedTestParams) bool { z := new(Fp2Element) kFieldOps.Inv(z, &x.ExtElem) // Now z = (1/x), so (z * x) * x == x kFieldOps.Mul(z, z, &x.ExtElem) kFieldOps.Mul(z, z, &x.ExtElem) return VartimeEqFp2(z, &x.ExtElem) } // This is more expensive; run fewer tests var quickCheckConfig = &quick.Config{MaxCount: (1 << (8 + quickCheckScaleFactor))} if err := quick.Check(inverseIsCorrect, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementBatch3Inv(t *testing.T) { batchInverseIsCorrect := func(x1, x2, x3 GeneratedTestParams) bool { var x1Inv, x2Inv, x3Inv Fp2Element kFieldOps.Inv(&x1Inv, &x1.ExtElem) kFieldOps.Inv(&x2Inv, &x2.ExtElem) kFieldOps.Inv(&x3Inv, &x3.ExtElem) var y1, y2, y3 Fp2Element kCurveOps.Fp2Batch3Inv(&x1.ExtElem, &x2.ExtElem, &x3.ExtElem, &y1, &y2, &y3) return (VartimeEqFp2(&x1Inv, &y1) && VartimeEqFp2(&x2Inv, &y2) && VartimeEqFp2(&x3Inv, &y3)) } // This is more expensive; run fewer tests var quickCheckConfig = &quick.Config{MaxCount: (1 << (5 + quickCheckScaleFactor))} if err := quick.Check(batchInverseIsCorrect, quickCheckConfig); err != nil { t.Error(err) } } //------------------------------------------------------------------------------ // Prime Field //------------------------------------------------------------------------------ func TestPrimeFieldElementMulVersusBigInt(t *testing.T) { mulMatchesBigInt := func(x, y primeFieldElement) bool { z := new(primeFieldElement) z.Mul(&x, &y) check := new(big.Int) check.Mul(toBigInt(&x.A), toBigInt(&y.A)) check.Mod(check, cln16prime) return check.Cmp(toBigInt(&z.A)) == 0 } if err := quick.Check(mulMatchesBigInt, quickCheckConfig); err != nil { t.Error(err) } } func TestPrimeFieldElementP34VersusBigInt(t *testing.T) { var p34, _ = new(big.Int).SetString("2588679435442326313244442059466701330356847411387267792529047419763669735170619711625720724140266678406138302904710050596300977994130638598261040117192787954244176710019728333589599932738193731745058771712747875468166412894207", 10) p34MatchesBigInt := func(x primeFieldElement) bool { z := new(primeFieldElement) z.P34(&x) check := toBigInt(&x.A) check.Exp(check, p34, cln16prime) return check.Cmp(toBigInt(&z.A)) == 0 } // This is more expensive; run fewer tests var quickCheckConfig = &quick.Config{MaxCount: (1 << (8 + quickCheckScaleFactor))} if err := quick.Check(p34MatchesBigInt, quickCheckConfig); err != nil { t.Error(err) } } func BenchmarkFp2ElementMul(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Mul(w, z, z) } } func BenchmarkFp2ElementInv(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Inv(w, z) } } func BenchmarkFp2ElementSquare(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Square(w, z) } } func BenchmarkFp2ElementAdd(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Add(w, z, z) } } func BenchmarkFp2ElementSub(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Sub(w, z, z) } } func BenchmarkPrimeFieldElementMul(b *testing.B) { z := &primeFieldElement{A: bench_x} w := new(primeFieldElement) for n := 0; n < b.N; n++ { w.Mul(z, z) } } // --- field operation functions func BenchmarkFp751Multiply(b *testing.B) { for n := 0; n < b.N; n++ { fp751Mul(&benchmarkFpElementX2, &bench_x, &bench_y) } } func BenchmarkFp751MontgomeryReduce(b *testing.B) { z := bench_z // This benchmark actually computes garbage, because // fp751MontgomeryReduce mangles its input, but since it's // constant-time that shouldn't matter for the benchmarks. for n := 0; n < b.N; n++ { fp751MontgomeryReduce(&benchmarkFpElement, &z) } } func BenchmarkFp751AddReduced(b *testing.B) { for n := 0; n < b.N; n++ { fp751AddReduced(&benchmarkFpElement, &bench_x, &bench_y) } } func BenchmarkFp751SubReduced(b *testing.B) { for n := 0; n < b.N; n++ { fp751SubReduced(&benchmarkFpElement, &bench_x, &bench_y) } } func BenchmarkFp751ConditionalSwap(b *testing.B) { x, y := bench_x, bench_y for n := 0; n < b.N; n++ { fp751ConditionalSwap(&x, &y, 1) fp751ConditionalSwap(&x, &y, 0) } } func BenchmarkFp751StrongReduce(b *testing.B) { x := bench_x for n := 0; n < b.N; n++ { fp751StrongReduce(&x) } } func BenchmarkFp751AddLazy(b *testing.B) { var z FpElement x, y := bench_x, bench_y for n := 0; n < b.N; n++ { fp751AddLazy(&z, &x, &y) } } func BenchmarkFp751X2AddLazy(b *testing.B) { x, y, z := bench_z, bench_z, bench_z for n := 0; n < b.N; n++ { fp751X2AddLazy(&x, &y, &z) } } func BenchmarkFp751X2SubLazy(b *testing.B) { x, y, z := bench_z, bench_z, bench_z for n := 0; n < b.N; n++ { fp751X2SubLazy(&x, &y, &z) } } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p751/consts.go000066400000000000000000000221601343600534300241620ustar00rootroot00000000000000package p751 import ( . "github.com/cloudflare/sidh/internal/isogeny" cpu "github.com/cloudflare/sidh/internal/utils" ) const ( // SIDH public key byte size P751_PublicKeySize = 564 // SIDH shared secret byte size. P751_SharedSecretSize = 188 // Max size of secret key for 2-torsion group, corresponds to 2^e2 P751_SecretBitLenA = 372 // Size of secret key for 3-torsion group, corresponds to floor(log_2(3^e3)) P751_SecretBitLenB = 378 // P751 bytelen ceil(751/8) P751_Bytelen = 94 // Size of a compuatation strategy for 2-torsion group strategySizeA = 185 // Size of a compuatation strategy for 3-torsion group strategySizeB = 238 // Number of 64-bit limbs used to store Fp element NumWords = 12 ) // CPU Capabilities. Those flags are referred by assembly code. According to // https://github.com/golang/go/issues/28230, variables referred from the // assembly must be in the same package. // We declare them variables not constants in order to facilitate testing. var ( // Signals support for MULX which is in BMI2 HasBMI2 = cpu.X86.HasBMI2 // Signals support for ADX and BMI2 HasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX ) // The x-coordinate of PA var P751_affine_PA = Fp2Element{ A: FpElement{ 0xC2FC08CEAB50AD8B, 0x1D7D710F55E457B1, 0xE8738D92953DCD6E, 0xBAA7EBEE8A3418AA, 0xC9A288345F03F46F, 0xC8D18D167CFE2616, 0x02043761F6B1C045, 0xAA1975E13180E7E9, 0x9E13D3FDC6690DE6, 0x3A024640A3A3BB4F, 0x4E5AD44E6ACBBDAE, 0x0000544BEB561DAD, }, B: FpElement{ 0xE6CC41D21582E411, 0x07C2ECB7C5DF400A, 0xE8E34B521432AEC4, 0x50761E2AB085167D, 0x032CFBCAA6094B3C, 0x6C522F5FDF9DDD71, 0x1319217DC3A1887D, 0xDC4FB25803353A86, 0x362C8D7B63A6AB09, 0x39DCDFBCE47EA488, 0x4C27C99A2C28D409, 0x00003CB0075527C4, }, } // The x-coordinate of QA var P751_affine_QA = Fp2Element{ A: FpElement{ 0xD56FE52627914862, 0x1FAD60DC96B5BAEA, 0x01E137D0BF07AB91, 0x404D3E9252161964, 0x3C5385E4CD09A337, 0x4476426769E4AF73, 0x9790C6DB989DFE33, 0xE06E1C04D2AA8B5E, 0x38C08185EDEA73B9, 0xAA41F678A4396CA6, 0x92B9259B2229E9A0, 0x00002F9326818BE0, }, B: FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, }, } // The x-coordinate of RA = PA-QA var P751_affine_RA = Fp2Element{ A: FpElement{ 0x0BB84441DFFD19B3, 0x84B4DEA99B48C18E, 0x692DE648AD313805, 0xE6D72761B6DFAEE0, 0x223975C672C3058D, 0xA0FDE0C3CBA26FDC, 0xA5326132A922A3CA, 0xCA5E7F5D5EA96FA4, 0x127C7EFE33FFA8C6, 0x4749B1567E2A23C4, 0x2B7DF5B4AF413BFA, 0x0000656595B9623C, }, B: FpElement{ 0xED78C17F1EC71BE8, 0xF824D6DF753859B1, 0x33A10839B2A8529F, 0xFC03E9E25FDEA796, 0xC4708A8054DF1762, 0x4034F2EC034C6467, 0xABFB70FBF06ECC79, 0xDABE96636EC108B7, 0x49CBCFB090605FD3, 0x20B89711819A45A7, 0xFB8E1590B2B0F63E, 0x0000556A5F964AB2, }, } // The x-coordinate of PB var P751_affine_PB = Fp2Element{ A: FpElement{ 0xCFB6D71EF867AB0B, 0x4A5FDD76E9A45C76, 0x38B1EE69194B1F03, 0xF6E7B18A7761F3F0, 0xFCF01A486A52C84C, 0xCBE2F63F5AA75466, 0x6487BCE837B5E4D6, 0x7747F5A8C622E9B8, 0x4CBFE1E4EE6AEBBA, 0x8A8616A13FA91512, 0x53DB980E1579E0A5, 0x000058FEBFF3BE69, }, B: FpElement{ 0xA492034E7C075CC3, 0x677BAF00B04AA430, 0x3AAE0C9A755C94C8, 0x1DC4B064E9EBB08B, 0x3684EDD04E826C66, 0x9BAA6CB661F01B22, 0x20285A00AD2EFE35, 0xDCE95ABD0497065F, 0x16C7FBB3778E3794, 0x26B3AC29CEF25AAF, 0xFB3C28A31A30AC1D, 0x000046ED190624EE, }, } // The x-coordinate of QB var P751_affine_QB = Fp2Element{ A: FpElement{ 0xF1A8C9ED7B96C4AB, 0x299429DA5178486E, 0xEF4926F20CD5C2F4, 0x683B2E2858B4716A, 0xDDA2FBCC3CAC3EEB, 0xEC055F9F3A600460, 0xD5A5A17A58C3848B, 0x4652D836F42EAED5, 0x2F2E71ED78B3A3B3, 0xA771C057180ADD1D, 0xC780A5D2D835F512, 0x0000114EA3B55AC1, }, B: FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, }, } // The x-coordinate of RB = PB - QB var P751_affine_RB = Fp2Element{ A: FpElement{ 0x1C0D6733769D0F31, 0xF084C3086E2659D1, 0xE23D5DA27BCBD133, 0xF38EC9A8D5864025, 0x6426DC781B3B645B, 0x4B24E8E3C9FB03EE, 0x6432792F9D2CEA30, 0x7CC8E8B1AE76E857, 0x7F32BFB626BB8963, 0xB9F05995B48D7B74, 0x4D71200A7D67E042, 0x0000228457AF0637, }, B: FpElement{ 0x4AE37E7D8F72BD95, 0xDD2D504B3E993488, 0x5D14E7FA1ECB3C3E, 0x127610CEB75D6350, 0x255B4B4CAC446B11, 0x9EA12336C1F70CAF, 0x79FA68A2147BC2F8, 0x11E895CFDADBBC49, 0xE4B9D3C4D6356C18, 0x44B25856A67F951C, 0x5851541F61308D0B, 0x00002FFD994F7E4C, }, } // 2-torsion group computation strategy var P751_AliceIsogenyStrategy = [strategySizeA]uint32{ 0x50, 0x30, 0x1B, 0x0F, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x0C, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x15, 0x0C, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x21, 0x14, 0x0C, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x08, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01} // 3-torsion group computation strategy var P751_BobIsogenyStrategy = [strategySizeB]uint32{ 0x70, 0x3F, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x1F, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x0F, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x31, 0x1F, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x0F, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x15, 0x0C, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01} // Used internally by this package. Not consts as Go doesn't allow arrays to be consts // ------------------------------- // p751 var p751 = FpElement{ 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xeeafffffffffffff, 0xe3ec968549f878a8, 0xda959b1a13f7cc76, 0x084e9867d6ebe876, 0x8562b5045cb25748, 0x0e12909f97badc66, 0x00006fe5d541f71c} // 2*p751 var p751x2 = FpElement{ 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xDD5FFFFFFFFFFFFF, 0xC7D92D0A93F0F151, 0xB52B363427EF98ED, 0x109D30CFADD7D0ED, 0x0AC56A08B964AE90, 0x1C25213F2F75B8CD, 0x0000DFCBAA83EE38} // p751 + 1 var p751p1 = FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xeeb0000000000000, 0xe3ec968549f878a8, 0xda959b1a13f7cc76, 0x084e9867d6ebe876, 0x8562b5045cb25748, 0x0e12909f97badc66, 0x00006fe5d541f71c} // R^2 = (2^768)^2 mod p var p751R2 = FpElement{ 2535603850726686808, 15780896088201250090, 6788776303855402382, 17585428585582356230, 5274503137951975249, 2266259624764636289, 11695651972693921304, 13072885652150159301, 4908312795585420432, 6229583484603254826, 488927695601805643, 72213483953973} // 1*R mod p var P751_OneFp2 = Fp2Element{ A: FpElement{ 0x249ad, 0x0, 0x0, 0x0, 0x0, 0x8310000000000000, 0x5527b1e4375c6c66, 0x697797bf3f4f24d0, 0xc89db7b2ac5c4e2e, 0x4ca4b439d2076956, 0x10f7926c7512c7e9, 0x2d5b24bce5e2}, } // 1/2 * R mod p var P751_HalfFp2 = Fp2Element{ A: FpElement{ 0x00000000000124D6, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xB8E0000000000000, 0x9C8A2434C0AA7287, 0xA206996CA9A378A3, 0x6876280D41A41B52, 0xE903B49F175CE04F, 0x0F8511860666D227, 0x00004EA07CFF6E7F}, } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p751/curve_test.go000066400000000000000000000221761343600534300250430ustar00rootroot00000000000000package p751 import ( "bytes" . "github.com/cloudflare/sidh/internal/isogeny" "testing" "testing/quick" ) func TestOne(t *testing.T) { var tmp Fp2Element kFieldOps.Mul(&tmp, &P751_OneFp2, &affine_xP) if !VartimeEqFp2(&tmp, &affine_xP) { t.Error("Not equal 1") } } // This test is here only to ensure that ScalarMult helper works correctly func TestScalarMultVersusSage(t *testing.T) { var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P751_OneFp2} xP = ScalarMult(&curve, &xP, mScalarBytes[:]) // = x([m]P) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(&affine_xaP, affine_xQ) { t.Error("\nExpected\n", affine_xaP, "\nfound\n", affine_xQ) } } func Test_jInvariant(t *testing.T) { var curve = ProjectiveCurveParameters{A: curve_A, C: curve_C} var jbufRes [P751_SharedSecretSize]byte var jbufExp [P751_SharedSecretSize]byte // Computed using Sage // j = 3674553797500778604587777859668542828244523188705960771798425843588160903687122861541242595678107095655647237100722594066610650373491179241544334443939077738732728884873568393760629500307797547379838602108296735640313894560419*i + 3127495302417548295242630557836520229396092255080675419212556702820583041296798857582303163183558315662015469648040494128968509467224910895884358424271180055990446576645240058960358037224785786494172548090318531038910933793845 var known_j = Fp2Element{ A: FpElement{0xc7a8921c1fb23993, 0xa20aea321327620b, 0xf1caa17ed9676fa8, 0x61b780e6b1a04037, 0x47784af4c24acc7a, 0x83926e2e300b9adf, 0xcd891d56fae5b66, 0x49b66985beb733bc, 0xd4bcd2a473d518f, 0xe242239991abe224, 0xa8af5b20f98672f8, 0x139e4d4e4d98}, B: FpElement{0xb5b52a21f81f359, 0x715e3a865db6d920, 0x9bac2f9d8911978b, 0xef14acd8ac4c1e3d, 0xe81aacd90cfb09c8, 0xaf898288de4a09d9, 0xb85a7fb88c5c4601, 0x2c37c3f1dd303387, 0x7ad3277fe332367c, 0xd4cbee7f25a8e6f8, 0x36eacbe979eaeffa, 0x59eb5a13ac33}, } kCurveOps.Jinvariant(&curve, jbufRes[:]) kCurveOps.Fp2ToBytes(jbufExp[:], &known_j) if !bytes.Equal(jbufRes[:], jbufExp[:]) { t.Error("Computed incorrect j-invariant: found\n", jbufRes, "\nexpected\n", jbufExp) } } func TestProjectivePointVartimeEq(t *testing.T) { var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P751_OneFp2} xQ := xP // Scale xQ, which results in the same projective point kFieldOps.Mul(&xQ.X, &xQ.X, &curve_A) kFieldOps.Mul(&xQ.Z, &xQ.Z, &curve_A) if !VartimeEqProjFp2(&xP, &xQ) { t.Error("Expected the scaled point to be equal to the original") } } func TestPointDoubleVersusSage(t *testing.T) { var curve = ProjectiveCurveParameters{A: curve_A, C: curve_C} var params = kCurveOps.CalcCurveParamsEquiv4(&curve) var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P751_OneFp2} kCurveOps.Pow2k(&xP, ¶ms, 1) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xQ, &affine_xP2) { t.Error("\nExpected\n", affine_xP2, "\nfound\n", affine_xQ) } } func TestPointMul4VersusSage(t *testing.T) { var params = kCurveOps.CalcCurveParamsEquiv4(&curve) var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P751_OneFp2} kCurveOps.Pow2k(&xP, ¶ms, 2) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xQ, &affine_xP4) { t.Error("\nExpected\n", affine_xP4, "\nfound\n", affine_xQ) } } func TestPointMul9VersusSage(t *testing.T) { var params = kCurveOps.CalcCurveParamsEquiv3(&curve) var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P751_OneFp2} kCurveOps.Pow3k(&xP, ¶ms, 2) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xQ, &affine_xP9) { t.Error("\nExpected\n", affine_xP9, "\nfound\n", affine_xQ) } } func TestPointPow2kVersusScalarMult(t *testing.T) { var xP, xQ, xR ProjectivePoint var params = kCurveOps.CalcCurveParamsEquiv4(&curve) xP = ProjectivePoint{X: affine_xP, Z: P751_OneFp2} xQ = xP kCurveOps.Pow2k(&xQ, ¶ms, 5) xR = ScalarMult(&curve, &xP, []byte{32}) affine_xQ := xQ.ToAffine(kCurveOps) // = x([32]P) affine_xR := xR.ToAffine(kCurveOps) // = x([32]P) if !VartimeEqFp2(affine_xQ, affine_xR) { t.Error("\nExpected\n", affine_xQ, "\nfound\n", affine_xR) } } func TestRecoverCoordinateA(t *testing.T) { var cparam ProjectiveCurveParameters // Vectors generated with SIKE reference implementation var a = Fp2Element{ A: FpElement{0x9331D9C5AAF59EA4, 0xB32B702BE4046931, 0xCEBB333912ED4D34, 0x5628CE37CD29C7A2, 0x0BEAC5ED48B7F58E, 0x1FB9D3E281D65B07, 0x9C0CFACC1E195662, 0xAE4BCE0F6B70F7D9, 0x59E4E63D43FE71A0, 0xEF7CE57560CC8615, 0xE44A8FB7901E74E8, 0x000069D13C8366D1}, B: FpElement{0xF6DA1070279AB966, 0xA78FB0CE7268C762, 0x19B40F044A57ABFA, 0x7AC8EE6160C0C233, 0x93D4993442947072, 0x757D2B3FA4E44860, 0x073A920F8C4D5257, 0x2031F1B054734037, 0xDEFAA1D2406555CD, 0x26F9C70E1496BE3D, 0x5B3F335A0A4D0976, 0x000013628B2E9C59}} var affine_xP = Fp2Element{ A: FpElement{0xea6b2d1e2aebb250, 0x35d0b205dc4f6386, 0xb198e93cb1830b8d, 0x3b5b456b496ddcc6, 0x5be3f0d41132c260, 0xce5f188807516a00, 0x54f3e7469ea8866d, 0x33809ef47f36286, 0x6fa45f83eabe1edb, 0x1b3391ae5d19fd86, 0x1e66daf48584af3f, 0xb430c14aaa87}, B: FpElement{0x97b41ebc61dcb2ad, 0x80ead31cb932f641, 0x40a940099948b642, 0x2a22fd16cdc7fe84, 0xaabf35b17579667f, 0x76c1d0139feb4032, 0x71467e1e7b1949be, 0x678ca8dadd0d6d81, 0x14445daea9064c66, 0x92d161eab4fa4691, 0x8dfbb01b6b238d36, 0x2e3718434e4e}} var affine_xQ = Fp2Element{ A: FpElement{0xb055cf0ca1943439, 0xa9ff5de2fa6c69ed, 0x4f2761f934e5730a, 0x61a1dcaa1f94aa4b, 0xce3c8fadfd058543, 0xeac432aaa6701b8e, 0x8491d523093aea8b, 0xba273f9bd92b9b7f, 0xd8f59fd34439bb5a, 0xdc0350261c1fe600, 0x99375ab1eb151311, 0x14d175bbdbc5}, B: FpElement{0xffb0ef8c2111a107, 0x55ceca3825991829, 0xdbf8a1ccc075d34b, 0xb8e9187bd85d8494, 0x670aa2d5c34a03b0, 0xef9fe2ed2b064953, 0xc911f5311d645aee, 0xf4411f409e410507, 0x934a0a852d03e1a8, 0xe6274e67ae1ad544, 0x9f4bc563c69a87bc, 0x6f316019681e}} var affine_xQmP = Fp2Element{ A: FpElement{0x6ffb44306a153779, 0xc0ffef21f2f918f3, 0x196c46d35d77f778, 0x4a73f80452edcfe6, 0x9b00836bce61c67f, 0x387879418d84219e, 0x20700cf9fc1ec5d1, 0x1dfe2356ec64155e, 0xf8b9e33038256b1c, 0xd2aaf2e14bada0f0, 0xb33b226e79a4e313, 0x6be576fad4e5}, B: FpElement{0x7db5dbc88e00de34, 0x75cc8cb9f8b6e11e, 0x8c8001c04ebc52ac, 0x67ef6c981a0b5a94, 0xc3654fbe73230738, 0xc6a46ee82983ceca, 0xed1aa61a27ef49f0, 0x17fe5a13b0858fe0, 0x9ae0ca945a4c6b3c, 0x234104a218ad8878, 0xa619627166104394, 0x556a01ff2e7e}} cparam.C = P751_OneFp2 kCurveOps.RecoverCoordinateA(&cparam, &affine_xP, &affine_xQ, &affine_xQmP) // Check A is correct if !VartimeEqFp2(&cparam.A, &a) { t.Error("\nExpected\n", a, "\nfound\n", cparam.A) } // Check C is not changed if !VartimeEqFp2(&cparam.C, &P751_OneFp2) { t.Error("\nExpected\n", cparam.C, "\nfound\n", P751_OneFp2) } } func TestR2LVersusSage(t *testing.T) { var xR ProjectivePoint sageAffine_xR := Fp2Element{ A: FpElement{0x729465ba800d4fd5, 0x9398015b59e514a1, 0x1a59dd6be76c748e, 0x1a7db94eb28dd55c, 0x444686e680b1b8ec, 0xcc3d4ace2a2454ff, 0x51d3dab4ec95a419, 0xc3b0f33594acac6a, 0x9598a74e7fd44f8a, 0x4fbf8c638f1c2e37, 0x844e347033052f51, 0x6cd6de3eafcf}, B: FpElement{0x85da145412d73430, 0xd83c0e3b66eb3232, 0xd08ff2d453ec1369, 0xa64aaacfdb395b13, 0xe9cba211a20e806e, 0xa4f80b175d937cfc, 0x556ce5c64b1f7937, 0xb59b39ea2b3fdf7a, 0xc2526b869a4196b3, 0x8dad90bca9371750, 0xdfb4a30c9d9147a2, 0x346d2130629b}} xR = kCurveOps.ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], uint(len(mScalarBytes)*8), mScalarBytes[:]) affine_xR := xR.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xR, &sageAffine_xR) { t.Error("\nExpected\n", sageAffine_xR, "\nfound\n", affine_xR) } } func TestPointTripleVersusAddDouble(t *testing.T) { tripleEqualsAddDouble := func(params GeneratedTestParams) bool { var P2, P3, P2plusP ProjectivePoint eqivParams4 := kCurveOps.CalcCurveParamsEquiv4(¶ms.Cparam) eqivParams3 := kCurveOps.CalcCurveParamsEquiv3(¶ms.Cparam) P2 = params.Point P3 = params.Point kCurveOps.Pow2k(&P2, &eqivParams4, 1) // = x([2]P) kCurveOps.Pow3k(&P3, &eqivParams3, 1) // = x([3]P) P2plusP = AddProjFp2(&P2, ¶ms.Point, ¶ms.Point) // = x([2]P + P) return VartimeEqProjFp2(&P3, &P2plusP) } if err := quick.Check(tripleEqualsAddDouble, quickCheckConfig); err != nil { t.Error(err) } } func BenchmarkThreePointLadder379BitScalar(b *testing.B) { var mScalarBytes = [...]uint8{84, 222, 146, 63, 85, 18, 173, 162, 167, 38, 10, 8, 143, 176, 93, 228, 247, 128, 50, 128, 205, 42, 15, 137, 119, 67, 43, 3, 61, 91, 237, 24, 235, 12, 53, 96, 186, 164, 232, 223, 197, 224, 64, 109, 137, 63, 246, 4} for n := 0; n < b.N; n++ { kCurveOps.ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], uint(len(mScalarBytes)*8), mScalarBytes[:]) } } func BenchmarkR2L379BitScalar(b *testing.B) { var mScalarBytes = [...]uint8{84, 222, 146, 63, 85, 18, 173, 162, 167, 38, 10, 8, 143, 176, 93, 228, 247, 128, 50, 128, 205, 42, 15, 137, 119, 67, 43, 3, 61, 91, 237, 24, 235, 12, 53, 96, 186, 164, 232, 223, 197, 224, 64, 109, 137, 63, 246, 4} for n := 0; n < b.N; n++ { kCurveOps.ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], uint(len(mScalarBytes)*8), mScalarBytes[:]) } } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p751/field_ops.go000066400000000000000000000177211343600534300246240ustar00rootroot00000000000000package p751 import . "github.com/cloudflare/sidh/internal/isogeny" // 2*p751 var () //------------------------------------------------------------------------------ // Implementtaion of FieldOperations //------------------------------------------------------------------------------ // Implements FieldOps type fp751Ops struct{} func FieldOperations() FieldOps { return &fp751Ops{} } func (fp751Ops) Add(dest, lhs, rhs *Fp2Element) { fp751AddReduced(&dest.A, &lhs.A, &rhs.A) fp751AddReduced(&dest.B, &lhs.B, &rhs.B) } func (fp751Ops) Sub(dest, lhs, rhs *Fp2Element) { fp751SubReduced(&dest.A, &lhs.A, &rhs.A) fp751SubReduced(&dest.B, &lhs.B, &rhs.B) } func (fp751Ops) Mul(dest, lhs, rhs *Fp2Element) { // Let (a,b,c,d) = (lhs.a,lhs.b,rhs.a,rhs.b). a := &lhs.A b := &lhs.B c := &rhs.A d := &rhs.B // We want to compute // // (a + bi)*(c + di) = (a*c - b*d) + (a*d + b*c)i // // Use Karatsuba's trick: note that // // (b - a)*(c - d) = (b*c + a*d) - a*c - b*d // // so (a*d + b*c) = (b-a)*(c-d) + a*c + b*d. var ac, bd FpElementX2 fp751Mul(&ac, a, c) // = a*c*R*R fp751Mul(&bd, b, d) // = b*d*R*R var b_minus_a, c_minus_d FpElement fp751SubReduced(&b_minus_a, b, a) // = (b-a)*R fp751SubReduced(&c_minus_d, c, d) // = (c-d)*R var ad_plus_bc FpElementX2 fp751Mul(&ad_plus_bc, &b_minus_a, &c_minus_d) // = (b-a)*(c-d)*R*R fp751X2AddLazy(&ad_plus_bc, &ad_plus_bc, &ac) // = ((b-a)*(c-d) + a*c)*R*R fp751X2AddLazy(&ad_plus_bc, &ad_plus_bc, &bd) // = ((b-a)*(c-d) + a*c + b*d)*R*R fp751MontgomeryReduce(&dest.B, &ad_plus_bc) // = (a*d + b*c)*R mod p var ac_minus_bd FpElementX2 fp751X2SubLazy(&ac_minus_bd, &ac, &bd) // = (a*c - b*d)*R*R fp751MontgomeryReduce(&dest.A, &ac_minus_bd) // = (a*c - b*d)*R mod p } func (fp751Ops) Square(dest, x *Fp2Element) { a := &x.A b := &x.B // We want to compute // // (a + bi)*(a + bi) = (a^2 - b^2) + 2abi. var a2, a_plus_b, a_minus_b FpElement fp751AddReduced(&a2, a, a) // = a*R + a*R = 2*a*R fp751AddReduced(&a_plus_b, a, b) // = a*R + b*R = (a+b)*R fp751SubReduced(&a_minus_b, a, b) // = a*R - b*R = (a-b)*R var asq_minus_bsq, ab2 FpElementX2 fp751Mul(&asq_minus_bsq, &a_plus_b, &a_minus_b) // = (a+b)*(a-b)*R*R = (a^2 - b^2)*R*R fp751Mul(&ab2, &a2, b) // = 2*a*b*R*R fp751MontgomeryReduce(&dest.A, &asq_minus_bsq) // = (a^2 - b^2)*R mod p fp751MontgomeryReduce(&dest.B, &ab2) // = 2*a*b*R mod p } // Set dest = 1/x // // Allowed to overlap dest with x. // // Returns dest to allow chaining operations. func (fp751Ops) Inv(dest, x *Fp2Element) { a := &x.A b := &x.B // We want to compute // // 1 1 (a - bi) (a - bi) // -------- = -------- -------- = ----------- // (a + bi) (a + bi) (a - bi) (a^2 + b^2) // // Letting c = 1/(a^2 + b^2), this is // // 1/(a+bi) = a*c - b*ci. var asq_plus_bsq primeFieldElement var asq, bsq FpElementX2 fp751Mul(&asq, a, a) // = a*a*R*R fp751Mul(&bsq, b, b) // = b*b*R*R fp751X2AddLazy(&asq, &asq, &bsq) // = (a^2 + b^2)*R*R fp751MontgomeryReduce(&asq_plus_bsq.A, &asq) // = (a^2 + b^2)*R mod p // Now asq_plus_bsq = a^2 + b^2 // Invert asq_plus_bsq inv := asq_plus_bsq inv.Mul(&asq_plus_bsq, &asq_plus_bsq) inv.P34(&inv) inv.Mul(&inv, &inv) inv.Mul(&inv, &asq_plus_bsq) var ac FpElementX2 fp751Mul(&ac, a, &inv.A) fp751MontgomeryReduce(&dest.A, &ac) var minus_b FpElement fp751SubReduced(&minus_b, &minus_b, b) var minus_bc FpElementX2 fp751Mul(&minus_bc, &minus_b, &inv.A) fp751MontgomeryReduce(&dest.B, &minus_bc) } // In case choice == 1, performs following swap in constant time: // xPx <-> xQx // xPz <-> xQz // Otherwise returns xPx, xPz, xQx, xQz unchanged func (fp751Ops) CondSwap(xPx, xPz, xQx, xQz *Fp2Element, choice uint8) { fp751ConditionalSwap(&xPx.A, &xQx.A, choice) fp751ConditionalSwap(&xPx.B, &xQx.B, choice) fp751ConditionalSwap(&xPz.A, &xQz.A, choice) fp751ConditionalSwap(&xPz.B, &xQz.B, choice) } // Converts values in x.A and x.B to Montgomery domain // x.A = x.A * R mod p // x.B = x.B * R mod p func (fp751Ops) ToMontgomery(x *Fp2Element) { var aRR FpElementX2 // convert to montgomery domain fp751Mul(&aRR, &x.A, &p751R2) // = a*R*R fp751MontgomeryReduce(&x.A, &aRR) // = a*R mod p fp751Mul(&aRR, &x.B, &p751R2) fp751MontgomeryReduce(&x.B, &aRR) } // Converts values in x.A and x.B from Montgomery domain // a = x.A mod p // b = x.B mod p // // After returning from the call x is not modified. func (fp751Ops) FromMontgomery(x *Fp2Element, out *Fp2Element) { var aR FpElementX2 // convert from montgomery domain copy(aR[:], x.A[:]) fp751MontgomeryReduce(&out.A, &aR) // = a mod p in [0, 2p) fp751StrongReduce(&out.A) // = a mod p in [0, p) for i := range aR { aR[i] = 0 } copy(aR[:], x.B[:]) fp751MontgomeryReduce(&out.B, &aR) fp751StrongReduce(&out.B) } //------------------------------------------------------------------------------ // Prime Field //------------------------------------------------------------------------------ // Represents an element of the prime field F_p in Montgomery domain type primeFieldElement struct { // The value `A`is represented by `aR mod p`. A FpElement } // Set dest = lhs * rhs. // // Allowed to overlap lhs or rhs with dest. // // Returns dest to allow chaining operations. func (dest *primeFieldElement) Mul(lhs, rhs *primeFieldElement) *primeFieldElement { a := &lhs.A // = a*R b := &rhs.A // = b*R var ab FpElementX2 fp751Mul(&ab, a, b) // = a*b*R*R fp751MontgomeryReduce(&dest.A, &ab) // = a*b*R mod p return dest } // Set dest = x^(2^k), for k >= 1, by repeated squarings. // // Allowed to overlap x with dest. // // Returns dest to allow chaining operations. func (dest *primeFieldElement) Pow2k(x *primeFieldElement, k uint8) *primeFieldElement { dest.Mul(x, x) for i := uint8(1); i < k; i++ { dest.Mul(dest, dest) } return dest } // Set dest = x^((p-3)/4). If x is square, this is 1/sqrt(x). // // Allowed to overlap x with dest. // // Returns dest to allow chaining operations. func (dest *primeFieldElement) P34(x *primeFieldElement) *primeFieldElement { // Sliding-window strategy computed with Sage, awk, sed, and tr. // // This performs sum(powStrategy) = 744 squarings and len(mulStrategy) // = 137 multiplications, in addition to 1 squaring and 15 // multiplications to build a lookup table. // // In total this is 745 squarings, 152 multiplications. Since squaring // is not implemented for the prime field, this is 897 multiplications // in total. powStrategy := [137]uint8{5, 7, 6, 2, 10, 4, 6, 9, 8, 5, 9, 4, 7, 5, 5, 4, 8, 3, 9, 5, 5, 4, 10, 4, 6, 6, 6, 5, 8, 9, 3, 4, 9, 4, 5, 6, 6, 2, 9, 4, 5, 5, 5, 7, 7, 9, 4, 6, 4, 8, 5, 8, 6, 6, 2, 9, 7, 4, 8, 8, 8, 4, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2} mulStrategy := [137]uint8{31, 23, 21, 1, 31, 7, 7, 7, 9, 9, 19, 15, 23, 23, 11, 7, 25, 5, 21, 17, 11, 5, 17, 7, 11, 9, 23, 9, 1, 19, 5, 3, 25, 15, 11, 29, 31, 1, 29, 11, 13, 9, 11, 27, 13, 19, 15, 31, 3, 29, 23, 31, 25, 11, 1, 21, 19, 15, 15, 21, 29, 13, 23, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 3} initialMul := uint8(27) // Build a lookup table of odd multiples of x. lookup := [16]primeFieldElement{} xx := &primeFieldElement{} xx.Mul(x, x) // Set xx = x^2 lookup[0] = *x for i := 1; i < 16; i++ { lookup[i].Mul(&lookup[i-1], xx) } // Now lookup = {x, x^3, x^5, ... } // so that lookup[i] = x^{2*i + 1} // so that lookup[k/2] = x^k, for odd k *dest = lookup[initialMul/2] for i := uint8(0); i < 137; i++ { dest.Pow2k(dest, powStrategy[i]) dest.Mul(dest, &lookup[mulStrategy[i]/2]) } return dest } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p751/isogeny_test.go000066400000000000000000000150131343600534300253640ustar00rootroot00000000000000package p751 import ( . "github.com/cloudflare/sidh/internal/isogeny" "testing" ) func TestFourIsogenyVersusSage(t *testing.T) { var xR, xP4, resPhiXr, expPhiXr ProjectivePoint var phi = Newisogeny4(kFieldOps) // TODO: The sage code needs to be aligned to SIDHv3 // sage: p = 2^372 * 3^239 - 1; Fp = GF(p) // sage: R. = Fp[] // sage: Fp2 = Fp.extension(x^2 + 1, 'i') // sage: i = Fp2.gen() // sage: E0Fp = EllipticCurve(Fp, [0,0,0,1,0]) // sage: E0Fp2 = EllipticCurve(Fp2, [0,0,0,1,0]) // sage: x_PA = 11 // sage: y_PA = -Fp(11^3 + 11).sqrt() // sage: x_PB = 6 // sage: y_PB = -Fp(6^3 + 6).sqrt() // sage: P_A = 3^239 * E0Fp((x_PA,y_PA)) // sage: P_B = 2^372 * E0Fp((x_PB,y_PB)) // sage: def tau(P): // ....: return E0Fp2( (-P.xy()[0], i*P.xy()[1])) // ....: // sage: m_B = 3*randint(0,3^238) // sage: m_A = 2*randint(0,2^371) // sage: R_A = E0Fp2(P_A) + m_A*tau(P_A) // sage: def y_recover(x, a): // ....: return (x**3 + a*x**2 + x).sqrt() // ....: // sage: first_4_torsion_point = E0Fp2(1, y_recover(Fp2(1),0)) // sage: sage_first_4_isogeny = E0Fp2.isogeny(first_4_torsion_point) // sage: a = Fp2(0) // sage: E1A = EllipticCurve(Fp2, [0,(2*(a+6))/(a-2),0,1,0]) // sage: sage_isomorphism = sage_first_4_isogeny.codomain().isomorphism_to(E1A) // sage: isogenized_R_A = sage_isomorphism(sage_first_4_isogeny(R_A)) // sage: P_4 = (2**(372-4))*isogenized_R_A // sage: P_4._order = 4 #otherwise falls back to generic group methods for order // sage: X4, Z4 = P_4.xy()[0], 1 // sage: phi4 = EllipticCurveIsogeny(E1A, P_4, None, 4) // sage: E2A_sage = phi4.codomain() # not in monty form // sage: Aprime, Cprime = 2*(2*X4^4 - Z4^4), Z4^4 // sage: E2A = EllipticCurve(Fp2, [0,Aprime/Cprime,0,1,0]) // sage: sage_iso = E2A_sage.isomorphism_to(E2A) // sage: isogenized2_R_A = sage_iso(phi4(isogenized_R_A)) xP4 = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x2afd75a913f3d5e7, 0x2918fba06f88c9ab, 0xa4ac4dc7cb526f05, 0x2d19e9391a607300, 0x7a79e2b34091b54, 0x3ad809dcb42f1792, 0xd46179328bd6402a, 0x1afa73541e2c4f3f, 0xf602d73ace9bdbd8, 0xd77ac58f6bab7004, 0x4689d97f6793b3b3, 0x4f26b00e42b7}, B: FpElement{0x6cdf918dafdcb890, 0x666f273cc29cfae2, 0xad00fcd31ba618e2, 0x5fbcf62bef2f6a33, 0xf408bb88318e5098, 0x84ab97849453d175, 0x501bbfcdcfb8e1ac, 0xf2370098e6b5542c, 0xc7dc73f5f0f6bd32, 0xdd76dcd86729d1cf, 0xca22c905029996e4, 0x5cf4a9373de3}}, Z: P751_OneFp2} xR = ProjectivePoint{ X: Fp2Element{ A: FpElement{0xff99e76f78da1e05, 0xdaa36bd2bb8d97c4, 0xb4328cee0a409daf, 0xc28b099980c5da3f, 0xf2d7cd15cfebb852, 0x1935103dded6cdef, 0xade81528de1429c3, 0x6775b0fa90a64319, 0x25f89817ee52485d, 0x706e2d00848e697, 0xc4958ec4216d65c0, 0xc519681417f}, B: FpElement{0x742fe7dde60e1fb9, 0x801a3c78466a456b, 0xa9f945b786f48c35, 0x20ce89e1b144348f, 0xf633970b7776217e, 0x4c6077a9b38976e5, 0x34a513fc766c7825, 0xacccba359b9cd65, 0xd0ca8383f0fd0125, 0x77350437196287a, 0x9fe1ad7706d4ea21, 0x4d26129ee42d}}, Z: P751_OneFp2} expPhiXr = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x111efd8bd0b7a01e, 0x6ab75a4f3789ca9b, 0x939dbe518564cac4, 0xf9eeaba1601d0434, 0x8d41f8ba6edac998, 0xfcd2557efe9aa170, 0xb3c3549c098b7844, 0x52874fef6f81127c, 0xb2b9ac82aa518bb3, 0xee70820230520a86, 0xd4012b7f5efb184a, 0x573e4536329b}, B: FpElement{0xa99952281e932902, 0x569a89a571f2c7b1, 0x6150143846ba3f6b, 0x11fd204441e91430, 0x7f469bd55c9b07b, 0xb72db8b9de35b161, 0x455a9a37a940512a, 0xb0cff7670abaf906, 0x18c785b7583375fe, 0x603ab9ca403c9148, 0xab54ba3a6e6c62c1, 0x2726d7d57c4f}}, Z: P751_OneFp2} phi.GenerateCurve(&xP4) resPhiXr = phi.EvaluatePoint(&xR) if !VartimeEqProjFp2(&expPhiXr, &resPhiXr) { t.Error("\nExpected\n", expPhiXr.ToAffine(kCurveOps), "\nfound\n", resPhiXr.ToAffine(kCurveOps)) } } func TestThreeIsogenyVersusSage(t *testing.T) { var xR, xP3, resPhiXr, expPhiXr ProjectivePoint var phi = Newisogeny3(kFieldOps) // sage: %colors Linux // sage: p = 2^372 * 3^239 - 1; Fp = GF(p) // sage: R. = Fp[] // sage: Fp2 = Fp.extension(x^2 + 1, 'i') // sage: i = Fp2.gen() // sage: E0Fp = EllipticCurve(Fp, [0,0,0,1,0]) // sage: E0Fp2 = EllipticCurve(Fp2, [0,0,0,1,0]) // sage: x_PA = 11 // sage: y_PA = -Fp(11^3 + 11).sqrt() // sage: x_PB = 6 // sage: y_PB = -Fp(6^3 + 6).sqrt() // sage: P_A = 3^239 * E0Fp((x_PA,y_PA)) // sage: P_B = 2^372 * E0Fp((x_PB,y_PB)) // sage: def tau(P): // ....: return E0Fp2( (-P.xy()[0], i*P.xy()[1])) // ....: // sage: m_B = 3*randint(0,3^238) // sage: R_B = E0Fp2(P_B) + m_B*tau(P_B) // sage: P_3 = (3^238)*R_B // sage: def three_isog(P_3, P): // ....: X3, Z3 = P_3.xy()[0], 1 // ....: XP, ZP = P.xy()[0], 1 // ....: x = (XP*(X3*XP - Z3*ZP)^2)/(ZP*(Z3*XP - X3*ZP)^2) // ....: A3, C3 = (Z3^4 + 9*X3^2*(2*Z3^2 - 3*X3^2)), 4*X3*Z3^3 // ....: cod = EllipticCurve(Fp2, [0,A3/C3,0,1,0]) // ....: return cod.lift_x(x) // ....: // sage: isogenized_R_B = three_isog(P_3, R_B) xR = ProjectivePoint{ X: Fp2Element{ A: FpElement{0xbd0737ed5cc9a3d7, 0x45ae6d476517c101, 0x6f228e9e7364fdb2, 0xbba4871225b3dbd, 0x6299ccd2e5da1a07, 0x38488fe4af5f2d0e, 0xec23cae5a86e980c, 0x26c804ba3f1edffa, 0xfbbed81932df60e5, 0x7e00e9d182ae9187, 0xc7654abb66d05f4b, 0x262d0567237b}, B: FpElement{0x3a3b5b6ad0b2ac33, 0x246602b5179127d3, 0x502ae0e9ad65077d, 0x10a3a37237e1bf70, 0x4a1ab9294dd05610, 0xb0f3adac30fe1fa6, 0x341995267faf70cb, 0xa14dd94d39cf4ec1, 0xce4b7527d1bf5568, 0xe0410423ed45c7e4, 0x38011809b6425686, 0x28f52472ebed}}, Z: P751_OneFp2} xP3 = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x7bb7a4a07b0788dc, 0xdc36a3f6607b21b0, 0x4750e18ee74cf2f0, 0x464e319d0b7ab806, 0xc25aa44c04f758ff, 0x392e8521a46e0a68, 0xfc4e76b63eff37df, 0x1f3566d892e67dd8, 0xf8d2eb0f73295e65, 0x457b13ebc470bccb, 0xfda1cc9efef5be33, 0x5dbf3d92cc02}, B: FpElement{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}, Z: P751_OneFp2} expPhiXr = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x286db7d75913c5b1, 0xcb2049ad50189220, 0xccee90ef765fa9f4, 0x65e52ce2730e7d88, 0xa6b6b553bd0d06e7, 0xb561ecec14591590, 0x17b7a66d8c64d959, 0x77778cecbe1461e, 0x9405c9c0c41a57ce, 0x8f6b4847e8ca7d3d, 0xf625eb987b366937, 0x421b3590e345}, B: FpElement{0x566b893803e7d8d6, 0xe8c71a04d527e696, 0x5a1d8f87bf5eb51, 0x42ae08ae098724f, 0x4ee3d7c7af40ca2e, 0xd9f9ab9067bb10a7, 0xecd53d69edd6328c, 0xa581e9202dea107d, 0x8bcdfb6c8ecf9257, 0xe7cbbc2e5cbcf2af, 0x5f031a8701f0e53e, 0x18312d93e3cb}}, Z: P751_OneFp2} phi.GenerateCurve(&xP3) resPhiXr = phi.EvaluatePoint(&xR) if !VartimeEqProjFp2(&expPhiXr, &resPhiXr) { t.Error("\nExpected\n", expPhiXr.ToAffine(kCurveOps), "\nfound\n", resPhiXr.ToAffine(kCurveOps)) } } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/p751/utils_test.go000066400000000000000000000465261343600534300250640ustar00rootroot00000000000000package p751 // Tools used for testing and debugging import ( "fmt" . "github.com/cloudflare/sidh/internal/isogeny" "math/big" "math/rand" "reflect" "testing/quick" ) /* ------------------------------------------------------------------------- Underlying field configuration -------------------------------------------------------------------------*/ var ( kFieldOps = FieldOperations() kParams = &SidhParams{ Op: kFieldOps, OneFp2: P751_OneFp2, HalfFp2: P751_HalfFp2, Bytelen: P751_Bytelen, } kCurveOps = &CurveOperations{Params: kParams} ) /* ------------------------------------------------------------------------- Configure testing/quick -------------------------------------------------------------------------*/ var ( quickCheckScaleFactor = uint8(3) quickCheckConfig = &quick.Config{MaxCount: (1 << (12 + quickCheckScaleFactor))} ) /* ------------------------------------------------------------------------- Structure used by tests -------------------------------------------------------------------------*/ type GeneratedTestParams struct { Point ProjectivePoint Cparam ProjectiveCurveParameters ExtElem Fp2Element } /* ------------------------------------------------------------------------- Test values -------------------------------------------------------------------------*/ // A = 4385300808024233870220415655826946795549183378139271271040522089756750951667981765872679172832050962894122367066234419550072004266298327417513857609747116903999863022476533671840646615759860564818837299058134292387429068536219*i + 1408083354499944307008104531475821995920666351413327060806684084512082259107262519686546161682384352696826343970108773343853651664489352092568012759783386151707999371397181344707721407830640876552312524779901115054295865393760 var ( curve_A = Fp2Element{ A: FpElement{0x8319eb18ca2c435e, 0x3a93beae72cd0267, 0x5e465e1f72fd5a84, 0x8617fa4150aa7272, 0x887da24799d62a13, 0xb079b31b3c7667fe, 0xc4661b150fa14f2e, 0xd4d2b2967bc6efd6, 0x854215a8b7239003, 0x61c5302ccba656c2, 0xf93194a27d6f97a2, 0x1ed9532bca75}, B: FpElement{0xb6f541040e8c7db6, 0x99403e7365342e15, 0x457e9cee7c29cced, 0x8ece72dc073b1d67, 0x6e73cef17ad28d28, 0x7aed836ca317472, 0x89e1de9454263b54, 0x745329277aa0071b, 0xf623dfc73bc86b9b, 0xb8e3c1d8a9245882, 0x6ad0b3d317770bec, 0x5b406e8d502b}} // C = 933177602672972392833143808100058748100491911694554386487433154761658932801917030685312352302083870852688835968069519091048283111836766101703759957146191882367397129269726925521881467635358356591977198680477382414690421049768*i + 9088894745865170214288643088620446862479558967886622582768682946704447519087179261631044546285104919696820250567182021319063155067584445633834024992188567423889559216759336548208016316396859149888322907914724065641454773776307 curve_C = Fp2Element{ A: FpElement{0x4fb2358bbf723107, 0x3a791521ac79e240, 0x283e24ef7c4c922f, 0xc89baa1205e33cc, 0x3031be81cff6fee1, 0xaf7a494a2f6a95c4, 0x248d251eaac83a1d, 0xc122fca1e2550c88, 0xbc0451b11b6cfd3d, 0x9c0a114ab046222c, 0x43b957b32f21f6ea, 0x5b9c87fa61de}, B: FpElement{0xacf142afaac15ec6, 0xfd1322a504a071d5, 0x56bb205e10f6c5c6, 0xe204d2849a97b9bd, 0x40b0122202fe7f2e, 0xecf72c6fafacf2cb, 0x45dfc681f869f60a, 0x11814c9aff4af66c, 0x9278b0c4eea54fe7, 0x9a633d5baf7f2e2e, 0x69a329e6f1a05112, 0x1d874ace23e4}} // x(P) = 8172151271761071554796221948801462094972242987811852753144865524899433583596839357223411088919388342364651632180452081960511516040935428737829624206426287774255114241789158000915683252363913079335550843837650671094705509470594*i + 9326574858039944121604015439381720195556183422719505497448541073272720545047742235526963773359004021838961919129020087515274115525812121436661025030481584576474033630899768377131534320053412545346268645085054880212827284581557 affine_xP = Fp2Element{ A: FpElement{0xe8d05f30aac47247, 0x576ec00c55441de7, 0xbf1a8ec5fe558518, 0xd77cb17f77515881, 0x8e9852837ee73ec4, 0x8159634ad4f44a6b, 0x2e4eb5533a798c5, 0x9be8c4354d5bc849, 0xf47dc61806496b84, 0x25d0e130295120e0, 0xdbef54095f8139e3, 0x5a724f20862c}, B: FpElement{0x3ca30d7623602e30, 0xfb281eddf45f07b7, 0xd2bf62d5901a45bc, 0xc67c9baf86306dd2, 0x4e2bd93093f538ca, 0xcfd92075c25b9cbe, 0xceafe9a3095bcbab, 0x7d928ad380c85414, 0x37c5f38b2afdc095, 0x75325899a7b779f4, 0xf130568249f20fdd, 0x178f264767d1}} // x([2]P) = 1476586462090705633631615225226507185986710728845281579274759750260315746890216330325246185232948298241128541272709769576682305216876843626191069809810990267291824247158062860010264352034514805065784938198193493333201179504845*i + 3623708673253635214546781153561465284135688791018117615357700171724097420944592557655719832228709144190233454198555848137097153934561706150196041331832421059972652530564323645509890008896574678228045006354394485640545367112224 affine_xP2 = Fp2Element{ A: FpElement{0x2a77afa8576ce979, 0xab1360e69b0aeba0, 0xd79e3e3cbffad660, 0x5fd0175aa10f106b, 0x1800ebafce9fbdbc, 0x228fc9142bdd6166, 0x867cf907314e34c3, 0xa58d18c94c13c31c, 0x699a5bc78b11499f, 0xa29fc29a01f7ccf1, 0x6c69c0c5347eebce, 0x38ecee0cc57}, B: FpElement{0x43607fd5f4837da0, 0x560bad4ce27f8f4a, 0x2164927f8495b4dd, 0x621103fdb831a997, 0xad740c4eea7db2db, 0x2cde0442205096cd, 0x2af51a70ede8324e, 0x41a4e680b9f3466, 0x5481f74660b8f476, 0xfcb2f3e656ff4d18, 0x42e3ce0837171acc, 0x44238c30530c}} // x([3]P) = 9351941061182433396254169746041546943662317734130813745868897924918150043217746763025923323891372857734564353401396667570940585840576256269386471444236630417779544535291208627646172485976486155620044292287052393847140181703665*i + 9010417309438761934687053906541862978676948345305618417255296028956221117900864204687119686555681136336037659036201780543527957809743092793196559099050594959988453765829339642265399496041485088089691808244290286521100323250273 affine_xP3 = Fp2Element{ A: FpElement{0x2096e3f23feca947, 0xf36f635aa4ad8634, 0xdae3b1c6983c5e9a, 0xe08df6c262cb74b4, 0xd2ca4edc37452d3d, 0xfb5f3fe42f500c79, 0x73740aa3abc2b21f, 0xd535fd869f914cca, 0x4a558466823fb67f, 0x3e50a7a0e3bfc715, 0xf43c6da9183a132f, 0x61aca1e1b8b9}, B: FpElement{0x1e54ec26ea5077bd, 0x61380572d8769f9a, 0xc615170684f59818, 0x6309c3b93e84ef6e, 0x33c74b1318c3fcd0, 0xfe8d7956835afb14, 0x2d5a7b55423c1ecc, 0x869db67edfafea68, 0x1292632394f0a628, 0x10bba48225bfd141, 0x6466c28b408daba, 0x63cacfdb7c43}} // x([2^2]P) = 441719501189485559222919502512761433931671682884872259563221427434901842337947564993718830905758163254463901652874331063768876314142359813382575876106725244985607032091781306919778265250690045578695338669105227100119314831452*i + 6961734028200975729170216310486458180126343885294922940439352055937945948015840788921225114530454649744697857047401608073256634790353321931728699534700109268264491160589480994022419317695690866764726967221310990488404411684053 affine_xP4 = Fp2Element{ A: FpElement{0x6f9dbe4c39175153, 0xf2fec757eb99e88, 0x43d7361a93733d91, 0x3abd10ed19c85a3d, 0xc4de9ab9c5ef7181, 0x53e375901684c900, 0x68ffc3e7d71c41ff, 0x47adab62c8d942fe, 0x226a33fd6fbb381d, 0x87ef4c8fdd83309a, 0xaca1cf44c5fa8799, 0x6cbae86c755f}, B: FpElement{0x4c80c37fe68282a7, 0xbd8b9d7248bf553a, 0x1fb0e8e74d5e1762, 0xb63fa0e4e5f91482, 0xc675ab8a45a1439, 0xdfa6772deace7820, 0xf0d813d71d9a9255, 0x53a1a58c634534bd, 0x4ebfc6485fdfd888, 0x6991fe4358bcf169, 0xc0547bdaca85b6fd, 0xf461548d632}} // x([3^2]P) = 3957171963425208493644602380039721164492341594850197356580248639045894821895524981729970650520936632013218950972842867220898274664982599375786979902471523505057611521217523103474682939638645404445093536997296151472632038973463*i + 1357869545269286021642168835877253886774707209614159162748874474269328421720121175566245719916322684751967981171882659798149072149161259103020057556362998810229937432814792024248155991141511691087135859252304684633946087474060 affine_xP9 = Fp2Element{ A: FpElement{0x7c0daa0f04ded4e0, 0x52dc4f883d85e065, 0x91afbdc2c1714d0b, 0xb7b3db8e658cfeba, 0x43d4e72a692882f3, 0x535c56d83753da30, 0xc8a58724433cbf5d, 0x351153c0a5e74219, 0x2c81827d19f93dd5, 0x26ef8aca3370ea1a, 0x1cf939a6dd225dec, 0x3403cb28ad41}, B: FpElement{0x93e7bc373a9ff7b, 0x57b8cc47635ebc0f, 0x92eab55689106cf3, 0x93643111d421f24c, 0x1c58b519506f6b7a, 0xebd409fb998faa13, 0x5c86ed799d09d80e, 0xd9a1d764d6363562, 0xf95e87f92fb0c4cc, 0x6b2bbaf5632a5609, 0x2d9b6a809dfaff7f, 0x29c0460348b}} // m = 96550223052359874398280314003345143371473380422728857598463622014420884224892 mScalarBytes = [...]uint8{0x7c, 0x7b, 0x95, 0xfa, 0xb4, 0x75, 0x6c, 0x48, 0x8c, 0x17, 0x55, 0xb4, 0x49, 0xf5, 0x1e, 0xa3, 0xb, 0x31, 0xf0, 0xa4, 0xa6, 0x81, 0xad, 0x94, 0x51, 0x11, 0xe7, 0xf5, 0x5b, 0x7d, 0x75, 0xd5} // x([m]P) = 7893578558852400052689739833699289348717964559651707250677393044951777272628231794999463214496545377542328262828965953246725804301238040891993859185944339366910592967840967752138115122568615081881937109746463885908097382992642*i + 8293895847098220389503562888233557012043261770526854885191188476280014204211818299871679993460086974249554528517413590157845430186202704783785316202196966198176323445986064452630594623103149383929503089342736311904030571524837 affine_xaP = Fp2Element{ A: FpElement{0x2112f3c7d7f938bb, 0x704a677f0a4df08f, 0x825370e31fb4ef00, 0xddbf79b7469f902, 0x27640c899ea739fd, 0xfb7b8b19f244108e, 0x546a6679dd3baebc, 0xe9f0ecf398d5265f, 0x223d2b350e75e461, 0x84b322a0b6aff016, 0xfabe426f539f8b39, 0x4507a0604f50}, B: FpElement{0xac77737e5618a5fe, 0xf91c0e08c436ca52, 0xd124037bc323533c, 0xc9a772bf52c58b63, 0x3b30c8f38ef6af4d, 0xb9eed160e134f36e, 0x24e3836393b25017, 0xc828be1b11baf1d9, 0x7b7dab585df50e93, 0x1ca3852c618bd8e0, 0x4efa73bcb359fa00, 0x50b6a923c2d4}} // Inputs for testing 3-point-ladder threePointLadderInputs = []ProjectivePoint{ // x(P) ProjectivePoint{ X: Fp2Element{ A: FpElement{0xe8d05f30aac47247, 0x576ec00c55441de7, 0xbf1a8ec5fe558518, 0xd77cb17f77515881, 0x8e9852837ee73ec4, 0x8159634ad4f44a6b, 0x2e4eb5533a798c5, 0x9be8c4354d5bc849, 0xf47dc61806496b84, 0x25d0e130295120e0, 0xdbef54095f8139e3, 0x5a724f20862c}, B: FpElement{0x3ca30d7623602e30, 0xfb281eddf45f07b7, 0xd2bf62d5901a45bc, 0xc67c9baf86306dd2, 0x4e2bd93093f538ca, 0xcfd92075c25b9cbe, 0xceafe9a3095bcbab, 0x7d928ad380c85414, 0x37c5f38b2afdc095, 0x75325899a7b779f4, 0xf130568249f20fdd, 0x178f264767d1}}, Z: P751_OneFp2, }, // x(Q) ProjectivePoint{ X: Fp2Element{ A: FpElement{0x2b71a2a93ad1e10e, 0xf0b9842a92cfb333, 0xae17373615a27f5c, 0x3039239f428330c4, 0xa0c4b735ed7dcf98, 0x6e359771ddf6af6a, 0xe986e4cac4584651, 0x8233a2b622d5518, 0xbfd67bf5f06b818b, 0xdffe38d0f5b966a6, 0xa86b36a3272ee00a, 0x193e2ea4f68f}, B: FpElement{0x5a0f396459d9d998, 0x479f42250b1b7dda, 0x4016b57e2a15bf75, 0xc59f915203fa3749, 0xd5f90257399cf8da, 0x1fb2dadfd86dcef4, 0x600f20e6429021dc, 0x17e347d380c57581, 0xc1b0d5fa8fe3e440, 0xbcf035330ac20e8, 0x50c2eb5f6a4f03e6, 0x86b7c4571}}, Z: P751_OneFp2, }, // x(P-Q) ProjectivePoint{ X: Fp2Element{ A: FpElement{0x4aafa9f378f7b5ff, 0x1172a683aa8eee0, 0xea518d8cbec2c1de, 0xe191bcbb63674557, 0x97bc19637b259011, 0xdbeae5c9f4a2e454, 0x78f64d1b72a42f95, 0xe71cb4ea7e181e54, 0xe4169d4c48543994, 0x6198c2286a98730f, 0xd21d675bbab1afa5, 0x2e7269fce391}, B: FpElement{0x23355783ce1d0450, 0x683164cf4ce3d93f, 0xae6d1c4d25970fd8, 0x7807007fb80b48cf, 0xa005a62ec2bbb8a2, 0x6b5649bd016004cb, 0xbb1a13fa1330176b, 0xbf38e51087660461, 0xe577fddc5dd7b930, 0x5f38116f56947cd3, 0x3124f30b98c36fde, 0x4ca9b6e6db37}}, Z: P751_OneFp2, }, } curve = ProjectiveCurveParameters{A: curve_A, C: curve_C} cln16prime, _ = new(big.Int).SetString("10354717741769305252977768237866805321427389645549071170116189679054678940682478846502882896561066713624553211618840202385203911976522554393044160468771151816976706840078913334358399730952774926980235086850991501872665651576831", 10) ) /* ------------------------------------------------------------------------- Values used by benchmarking tools -------------------------------------------------------------------------*/ // Package-level storage for this field element is intended to deter // compiler optimizations. var ( benchmarkFpElement FpElement benchmarkFpElementX2 FpElementX2 bench_x = FpElement{17026702066521327207, 5108203422050077993, 10225396685796065916, 11153620995215874678, 6531160855165088358, 15302925148404145445, 1248821577836769963, 9789766903037985294, 7493111552032041328, 10838999828319306046, 18103257655515297935, 27403304611634} bench_y = FpElement{4227467157325093378, 10699492810770426363, 13500940151395637365, 12966403950118934952, 16517692605450415877, 13647111148905630666, 14223628886152717087, 7167843152346903316, 15855377759596736571, 4300673881383687338, 6635288001920617779, 30486099554235} bench_z = FpElementX2{1595347748594595712, 10854920567160033970, 16877102267020034574, 12435724995376660096, 3757940912203224231, 8251999420280413600, 3648859773438820227, 17622716832674727914, 11029567000887241528, 11216190007549447055, 17606662790980286987, 4720707159513626555, 12887743598335030915, 14954645239176589309, 14178817688915225254, 1191346797768989683, 12629157932334713723, 6348851952904485603, 16444232588597434895, 7809979927681678066, 14642637672942531613, 3092657597757640067, 10160361564485285723, 240071237} ) // Helpers func (primeElement primeFieldElement) String() string { b := toBigInt(&primeElement.A) return fmt.Sprintf("%X", b.String()) } /* ------------------------------------------------------------------------- Helpers -------------------------------------------------------------------------*/ // Given xP = x(P), xQ = x(Q), and xPmQ = x(P-Q), compute xR = x(P+Q). // // Returns xR to allow chaining. Safe to overlap xP, xQ, xR. func AddProjFp2(xP, xQ, xPmQ *ProjectivePoint) ProjectivePoint { // Algorithm 1 of Costello-Smith. var v0, v1, v2, v3, v4 Fp2Element var xR ProjectivePoint kFieldOps.Add(&v0, &xP.X, &xP.Z) // X_P + Z_P kFieldOps.Sub(&v1, &xQ.X, &xQ.Z) kFieldOps.Mul(&v1, &v1, &v0) // (X_Q - Z_Q)(X_P + Z_P) kFieldOps.Sub(&v0, &xP.X, &xP.Z) // X_P - Z_P kFieldOps.Add(&v2, &xQ.X, &xQ.Z) kFieldOps.Mul(&v2, &v2, &v0) // (X_Q + Z_Q)(X_P - Z_P) kFieldOps.Add(&v3, &v1, &v2) kFieldOps.Square(&v3, &v3) // 4(X_Q X_P - Z_Q Z_P)^2 kFieldOps.Sub(&v4, &v1, &v2) kFieldOps.Square(&v4, &v4) // 4(X_Q Z_P - Z_Q X_P)^2 kFieldOps.Mul(&v0, &xPmQ.Z, &v3) // 4X_{P-Q}(X_Q X_P - Z_Q Z_P)^2 kFieldOps.Mul(&xR.Z, &xPmQ.X, &v4) // 4Z_{P-Q}(X_Q Z_P - Z_Q X_P)^2 xR.X = v0 return xR } // Given xP = x(P) and cached curve parameters Aplus2C = A + 2*C, C4 = 4*C, // compute xQ = x([2]P). // // Returns xQ to allow chaining. Safe to overlap xP, xQ. func DoubleProjFp2(xP *ProjectivePoint, Aplus2C, C4 *Fp2Element) ProjectivePoint { // Algorithm 2 of Costello-Smith, amended to work with projective curve coefficients. var v1, v2, v3, xz4 Fp2Element var xQ ProjectivePoint kFieldOps.Add(&v1, &xP.X, &xP.Z) // (X+Z)^2 kFieldOps.Square(&v1, &v1) kFieldOps.Sub(&v2, &xP.X, &xP.Z) // (X-Z)^2 kFieldOps.Square(&v2, &v2) kFieldOps.Sub(&xz4, &v1, &v2) // 4XZ = (X+Z)^2 - (X-Z)^2 kFieldOps.Mul(&v2, &v2, C4) // 4C(X-Z)^2 kFieldOps.Mul(&xQ.X, &v1, &v2) // 4C(X+Z)^2(X-Z)^2 kFieldOps.Mul(&v3, &xz4, Aplus2C) // 4XZ(A + 2C) kFieldOps.Add(&v3, &v3, &v2) // 4XZ(A + 2C) + 4C(X-Z)^2 kFieldOps.Mul(&xQ.Z, &v3, &xz4) // (4XZ(A + 2C) + 4C(X-Z)^2)4XZ // Now (xQ.x : xQ.z) // = (4C(X+Z)^2(X-Z)^2 : (4XZ(A + 2C) + 4C(X-Z)^2)4XZ ) // = ((X+Z)^2(X-Z)^2 : (4XZ((A + 2C)/4C) + (X-Z)^2)4XZ ) // = ((X+Z)^2(X-Z)^2 : (4XZ((a + 2)/4) + (X-Z)^2)4XZ ) return xQ } // Given x(P) and a scalar m in little-endian bytes, compute x([m]P) using the // Montgomery ladder. This is described in Algorithm 8 of Costello-Smith. // // This function's execution time is dependent only on the byte-length of the // input scalar. All scalars of the same input length execute in uniform time. // The scalar can be padded with zero bytes to ensure a uniform length. // // Safe to overlap the source with the destination. func ScalarMult(curve *ProjectiveCurveParameters, xP *ProjectivePoint, scalar []uint8) ProjectivePoint { var x0, x1, tmp ProjectivePoint var Aplus2C, C4 Fp2Element kFieldOps.Add(&Aplus2C, &curve.C, &curve.C) // = 2*C kFieldOps.Add(&C4, &Aplus2C, &Aplus2C) // = 4*C kFieldOps.Add(&Aplus2C, &Aplus2C, &curve.A) // = 2*C + A x0.X = P751_OneFp2 x1 = *xP // Iterate over the bits of the scalar, top to bottom prevBit := uint8(0) for i := len(scalar) - 1; i >= 0; i-- { scalarByte := scalar[i] for j := 7; j >= 0; j-- { bit := (scalarByte >> uint(j)) & 0x1 kCurveOps.Params.Op.CondSwap(&x0.X, &x0.Z, &x1.X, &x1.Z, (bit ^ prevBit)) //sProjectivePointConditionalSwap(&x0, &x1, (bit ^ prevBit)) tmp = DoubleProjFp2(&x0, &Aplus2C, &C4) x1 = AddProjFp2(&x0, &x1, xP) x0 = tmp prevBit = bit } } // now prevBit is the lowest bit of the scalar kCurveOps.Params.Op.CondSwap(&x0.X, &x0.Z, &x1.X, &x1.Z, prevBit) return x0 } // Returns true if lhs = rhs. Takes variable time. func VartimeEqFp2(lhs, rhs *Fp2Element) bool { a := *lhs b := *rhs fp751StrongReduce(&a.A) fp751StrongReduce(&a.B) fp751StrongReduce(&b.A) fp751StrongReduce(&b.B) eq := true for i := 0; i < len(a.A) && eq; i++ { eq = eq && (a.A[i] == b.A[i]) eq = eq && (a.B[i] == b.B[i]) } return eq } // Returns true if lhs = rhs. Takes variable time. func VartimeEqProjFp2(lhs, rhs *ProjectivePoint) bool { var t0, t1 Fp2Element kFieldOps.Mul(&t0, &lhs.X, &rhs.Z) kFieldOps.Mul(&t1, &lhs.Z, &rhs.X) return VartimeEqFp2(&t0, &t1) } func (GeneratedTestParams) generateFp2p751(rand *rand.Rand) Fp2Element { // Generation strategy: low limbs taken from [0,2^64); high limb // taken from smaller range // // Size hint is ignored since all elements are fixed size. // // Field elements taken in range [0,2p). Emulate this by capping // the high limb by the top digit of 2*p-1: // // sage: (2*p-1).digits(2^64)[-1] // 246065832128056 // // This still allows generating values >= 2p, but hopefully that // excess is OK (and if it's not, we'll find out, because it's for // testing...) // highLimb := rand.Uint64() % 246065832128056 fpElementGen := func() FpElement { return FpElement{ rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), highLimb, } } return Fp2Element{A: fpElementGen(), B: fpElementGen()} } func (c GeneratedTestParams) Generate(rand *rand.Rand, size int) reflect.Value { return reflect.ValueOf( GeneratedTestParams{ ProjectivePoint{ X: c.generateFp2p751(rand), Z: c.generateFp2p751(rand), }, ProjectiveCurveParameters{ A: c.generateFp2p751(rand), C: c.generateFp2p751(rand), }, c.generateFp2p751(rand), }) } func (x primeFieldElement) Generate(rand *rand.Rand, size int) reflect.Value { return reflect.ValueOf(primeFieldElement{ A: new(GeneratedTestParams).generateFp2p751(rand).A}) } // Convert an FpElement to a big.Int for testing. Because this is only // for testing, no big.Int to FpElement conversion is provided. func radix64ToBigInt(x []uint64) *big.Int { radix := new(big.Int) // 2^64 radix.UnmarshalText(([]byte)("18446744073709551616")) base := new(big.Int).SetUint64(1) val := new(big.Int).SetUint64(0) tmp := new(big.Int) for _, xi := range x { tmp.SetUint64(xi) tmp.Mul(tmp, base) val.Add(val, tmp) base.Mul(base, radix) } return val } // Converts number from Montgomery domain and returns big.Int func toBigInt(x *FpElement) *big.Int { var fp Fp2Element var in = Fp2Element{A: *x} kFieldOps.FromMontgomery(&in, &fp) return radix64ToBigInt(fp.A[:]) } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/sidh/000077500000000000000000000000001343600534300225545ustar00rootroot00000000000000golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/sidh/api.go000066400000000000000000000155461343600534300236670ustar00rootroot00000000000000package sidh import ( "errors" . "github.com/cloudflare/sidh/internal/isogeny" "io" ) // I keep it bool in order to be able to apply logical NOT type KeyVariant uint // Id's correspond to bitlength of the prime field characteristic // Currently FP_751 is the only one supported by this implementation const ( FP_503 uint8 = iota FP_751 FP_964 maxPrimeFieldId ) const ( // First 2 bits identify SIDH variant third bit indicates // wether key is a SIKE variant (set) or SIDH (not set) // 001 - SIDH: corresponds to 2-torsion group KeyVariant_SIDH_A KeyVariant = 1 << 0 // 010 - SIDH: corresponds to 3-torsion group KeyVariant_SIDH_B = 1 << 1 // 110 - SIKE KeyVariant_SIKE = 1<<2 | KeyVariant_SIDH_B ) // Base type for public and private key. Used mainly to carry domain // parameters. type key struct { // Domain parameters of the algorithm to be used with a key params *SidhParams // Flag indicates wether corresponds to 2-, 3-torsion group or SIKE keyVariant KeyVariant } // Defines operations on public key type PublicKey struct { key affine_xP Fp2Element affine_xQ Fp2Element affine_xQmP Fp2Element } // Defines operations on private key type PrivateKey struct { key // Secret key Scalar []byte // Used only by KEM S []byte } // Accessor to the domain parameters func (key *key) Params() *SidhParams { return key.params } // Accessor to key variant func (key *key) Variant() KeyVariant { return key.keyVariant } // NewPrivateKey initializes private key. // Usage of this function guarantees that the object is correctly initialized. func NewPrivateKey(id uint8, v KeyVariant) *PrivateKey { prv := &PrivateKey{key: key{params: Params(id), keyVariant: v}} if (v & KeyVariant_SIDH_A) == KeyVariant_SIDH_A { prv.Scalar = make([]byte, prv.params.A.SecretByteLen) } else { prv.Scalar = make([]byte, prv.params.B.SecretByteLen) } if v == KeyVariant_SIKE { prv.S = make([]byte, prv.params.MsgLen) } return prv } // NewPublicKey initializes public key. // Usage of this function guarantees that the object is correctly initialized. func NewPublicKey(id uint8, v KeyVariant) *PublicKey { return &PublicKey{key: key{params: Params(id), keyVariant: v}} } // Import clears content of the public key currently stored in the structure // and imports key stored in the byte string. Returns error in case byte string // size is wrong. Doesn't perform any validation. func (pub *PublicKey) Import(input []byte) error { if len(input) != pub.Size() { return errors.New("sidh: input to short") } op := CurveOperations{Params: pub.params} ssSz := pub.params.SharedSecretSize op.Fp2FromBytes(&pub.affine_xP, input[0:ssSz]) op.Fp2FromBytes(&pub.affine_xQ, input[ssSz:2*ssSz]) op.Fp2FromBytes(&pub.affine_xQmP, input[2*ssSz:3*ssSz]) return nil } // Exports currently stored key. In case structure hasn't been filled with key data // returned byte string is filled with zeros. func (pub *PublicKey) Export() []byte { output := make([]byte, pub.params.PublicKeySize) op := CurveOperations{Params: pub.params} ssSz := pub.params.SharedSecretSize op.Fp2ToBytes(output[0:ssSz], &pub.affine_xP) op.Fp2ToBytes(output[ssSz:2*ssSz], &pub.affine_xQ) op.Fp2ToBytes(output[2*ssSz:3*ssSz], &pub.affine_xQmP) return output } // Size returns size of the public key in bytes func (pub *PublicKey) Size() int { return pub.params.PublicKeySize } // Exports currently stored key. In case structure hasn't been filled with key data // returned byte string is filled with zeros. func (prv *PrivateKey) Export() []byte { ret := make([]byte, len(prv.Scalar)+len(prv.S)) copy(ret, prv.S) copy(ret[len(prv.S):], prv.Scalar) return ret } // Size returns size of the private key in bytes func (prv *PrivateKey) Size() int { tmp := len(prv.Scalar) if prv.Variant() == KeyVariant_SIKE { tmp += int(prv.params.MsgLen) } return tmp } // Import clears content of the private key currently stored in the structure // and imports key from octet string. In case of SIKE, the random value 'S' // must be prepended to the value of actual private key (see SIKE spec for details). // Function doesn't import public key value to PrivateKey object. func (prv *PrivateKey) Import(input []byte) error { if len(input) != prv.Size() { return errors.New("sidh: input to short") } copy(prv.S, input[:len(prv.S)]) copy(prv.Scalar, input[len(prv.S):]) return nil } // Generates random private key for SIDH or SIKE. Generated value is // formed as little-endian integer from key-space <2^(e2-1)..2^e2 - 1> // for KeyVariant_A or <2^(s-1)..2^s - 1>, where s = floor(log_2(3^e3)), // for KeyVariant_B. // // Returns error in case user provided RNG fails. func (prv *PrivateKey) Generate(rand io.Reader) error { var err error var dp *DomainParams if (prv.keyVariant & KeyVariant_SIDH_A) == KeyVariant_SIDH_A { dp = &prv.params.A } else { dp = &prv.params.B } if prv.keyVariant == KeyVariant_SIKE && err == nil { _, err = io.ReadFull(rand, prv.S) } // Private key generation takes advantage of the fact that keyspace for secret // key is (0, 2^x - 1), for some possitivite value of 'x' (see SIKE, 1.3.8). // It means that all bytes in the secret key, but the last one, can take any // value between <0x00,0xFF>. Similarily for the last byte, but generation // needs to chop off some bits, to make sure generated value is an element of // a key-space. _, err = io.ReadFull(rand, prv.Scalar) if err != nil { return err } prv.Scalar[len(prv.Scalar)-1] &= (1 << (dp.SecretBitLen % 8)) - 1 // Make sure scalar is SecretBitLen long. SIKE spec says that key // space starts from 0, but I'm not confortable with having low // value scalars used for private keys. It is still secrure as per // table 5.1 in [SIKE]. prv.Scalar[len(prv.Scalar)-1] |= 1 << ((dp.SecretBitLen % 8) - 1) return err } // Generates public key. // // Constant time. func (prv *PrivateKey) GeneratePublicKey() *PublicKey { if (prv.keyVariant & KeyVariant_SIDH_A) == KeyVariant_SIDH_A { return publicKeyGenA(prv) } return publicKeyGenB(prv) } // Computes a shared secret which is a j-invariant. Function requires that pub has // different KeyVariant than prv. Length of returned output is 2*ceil(log_2 P)/8), // where P is a prime defining finite field. // // It's important to notice that each keypair must not be used more than once // to calculate shared secret. // // Function may return error. This happens only in case provided input is invalid. // Constant time for properly initialized private and public key. func DeriveSecret(prv *PrivateKey, pub *PublicKey) ([]byte, error) { if (pub == nil) || (prv == nil) { return nil, errors.New("sidh: invalid arguments") } if (pub.keyVariant == prv.keyVariant) || (pub.params.Id != prv.params.Id) { return nil, errors.New("sidh: public and private are incompatbile") } if (prv.keyVariant & KeyVariant_SIDH_A) == KeyVariant_SIDH_A { return deriveSecretA(prv, pub), nil } else { return deriveSecretB(prv, pub), nil } } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/sidh/params.go000066400000000000000000000050501343600534300243660ustar00rootroot00000000000000package sidh import ( . "github.com/cloudflare/sidh/internal/isogeny" p503 "github.com/cloudflare/sidh/p503" p751 "github.com/cloudflare/sidh/p751" ) // Keeps mapping: SIDH prime field ID to domain parameters var sidhParams = make(map[uint8]SidhParams) // Params returns domain parameters corresponding to finite field and identified by // `id` provieded by the caller. Function panics in case `id` wasn't registered earlier. func Params(id uint8) *SidhParams { if val, ok := sidhParams[id]; ok { return &val } panic("sidh: SIDH Params ID unregistered") } func init() { p503 := SidhParams{ Id: FP_503, PublicKeySize: p503.P503_PublicKeySize, SharedSecretSize: p503.P503_SharedSecretSize, A: DomainParams{ Affine_P: p503.P503_affine_PA, Affine_Q: p503.P503_affine_QA, Affine_R: p503.P503_affine_RA, SecretBitLen: p503.P503_SecretBitLenA, SecretByteLen: uint((p503.P503_SecretBitLenA + 7) / 8), IsogenyStrategy: p503.P503_AliceIsogenyStrategy[:], }, B: DomainParams{ Affine_P: p503.P503_affine_PB, Affine_Q: p503.P503_affine_QB, Affine_R: p503.P503_affine_RB, SecretBitLen: p503.P503_SecretBitLenB, SecretByteLen: uint((p503.P503_SecretBitLenB + 7) / 8), IsogenyStrategy: p503.P503_BobIsogenyStrategy[:], }, OneFp2: p503.P503_OneFp2, HalfFp2: p503.P503_HalfFp2, MsgLen: 24, // SIKEp751 provides 128 bit of classical security ([SIKE], 5.1) KemSize: 16, Bytelen: p503.P503_Bytelen, Op: p503.FieldOperations(), } p751 := SidhParams{ Id: FP_751, PublicKeySize: p751.P751_PublicKeySize, SharedSecretSize: p751.P751_SharedSecretSize, A: DomainParams{ Affine_P: p751.P751_affine_PA, Affine_Q: p751.P751_affine_QA, Affine_R: p751.P751_affine_RA, IsogenyStrategy: p751.P751_AliceIsogenyStrategy[:], SecretBitLen: p751.P751_SecretBitLenA, SecretByteLen: uint((p751.P751_SecretBitLenA + 7) / 8), }, B: DomainParams{ Affine_P: p751.P751_affine_PB, Affine_Q: p751.P751_affine_QB, Affine_R: p751.P751_affine_RB, IsogenyStrategy: p751.P751_BobIsogenyStrategy[:], SecretBitLen: p751.P751_SecretBitLenB, SecretByteLen: uint((p751.P751_SecretBitLenB + 7) / 8), }, OneFp2: p751.P751_OneFp2, HalfFp2: p751.P751_HalfFp2, MsgLen: 32, // SIKEp751 provides 192 bit of classical security ([SIKE], 5.1) KemSize: 24, Bytelen: p751.P751_Bytelen, Op: p751.FieldOperations(), } sidhParams[FP_503] = p503 sidhParams[FP_751] = p751 } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/sidh/sidh.go000066400000000000000000000224201343600534300240320ustar00rootroot00000000000000package sidh import ( . "github.com/cloudflare/sidh/internal/isogeny" ) // ----------------------------------------------------------------------------- // Functions for traversing isogeny trees acoording to strategy. Key type 'A' is // // Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed // for public key generation. func traverseTreePublicKeyA(curve *ProjectiveCurveParameters, xR, phiP, phiQ, phiR *ProjectivePoint, pub *PublicKey) { var points = make([]ProjectivePoint, 0, 8) var indices = make([]int, 0, 8) var i, sidx int var op = CurveOperations{Params: pub.params} cparam := op.CalcCurveParamsEquiv4(curve) phi := Newisogeny4(op.Params.Op) strat := pub.params.A.IsogenyStrategy stratSz := len(strat) for j := 1; j <= stratSz; j++ { for i <= stratSz-j { points = append(points, *xR) indices = append(indices, i) k := strat[sidx] sidx++ op.Pow2k(xR, &cparam, 2*k) i += int(k) } cparam = phi.GenerateCurve(xR) for k := 0; k < len(points); k++ { points[k] = phi.EvaluatePoint(&points[k]) } *phiP = phi.EvaluatePoint(phiP) *phiQ = phi.EvaluatePoint(phiQ) *phiR = phi.EvaluatePoint(phiR) // pop xR from points *xR, points = points[len(points)-1], points[:len(points)-1] i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] } } // Traverses isogeny tree in order to compute xR needed // for public key generation. func traverseTreeSharedKeyA(curve *ProjectiveCurveParameters, xR *ProjectivePoint, pub *PublicKey) { var points = make([]ProjectivePoint, 0, 8) var indices = make([]int, 0, 8) var i, sidx int var op = CurveOperations{Params: pub.params} cparam := op.CalcCurveParamsEquiv4(curve) phi := Newisogeny4(op.Params.Op) strat := pub.params.A.IsogenyStrategy stratSz := len(strat) for j := 1; j <= stratSz; j++ { for i <= stratSz-j { points = append(points, *xR) indices = append(indices, i) k := strat[sidx] sidx++ op.Pow2k(xR, &cparam, 2*k) i += int(k) } cparam = phi.GenerateCurve(xR) for k := 0; k < len(points); k++ { points[k] = phi.EvaluatePoint(&points[k]) } // pop xR from points *xR, points = points[len(points)-1], points[:len(points)-1] i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] } } // Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed // for public key generation. func traverseTreePublicKeyB(curve *ProjectiveCurveParameters, xR, phiP, phiQ, phiR *ProjectivePoint, pub *PublicKey) { var points = make([]ProjectivePoint, 0, 8) var indices = make([]int, 0, 8) var i, sidx int var op = CurveOperations{Params: pub.params} cparam := op.CalcCurveParamsEquiv3(curve) phi := Newisogeny3(op.Params.Op) strat := pub.params.B.IsogenyStrategy stratSz := len(strat) for j := 1; j <= stratSz; j++ { for i <= stratSz-j { points = append(points, *xR) indices = append(indices, i) k := strat[sidx] sidx++ op.Pow3k(xR, &cparam, k) i += int(k) } cparam = phi.GenerateCurve(xR) for k := 0; k < len(points); k++ { points[k] = phi.EvaluatePoint(&points[k]) } *phiP = phi.EvaluatePoint(phiP) *phiQ = phi.EvaluatePoint(phiQ) *phiR = phi.EvaluatePoint(phiR) // pop xR from points *xR, points = points[len(points)-1], points[:len(points)-1] i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] } } // Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed // for public key generation. func traverseTreeSharedKeyB(curve *ProjectiveCurveParameters, xR *ProjectivePoint, pub *PublicKey) { var points = make([]ProjectivePoint, 0, 8) var indices = make([]int, 0, 8) var i, sidx int var op = CurveOperations{Params: pub.params} cparam := op.CalcCurveParamsEquiv3(curve) phi := Newisogeny3(op.Params.Op) strat := pub.params.B.IsogenyStrategy stratSz := len(strat) for j := 1; j <= stratSz; j++ { for i <= stratSz-j { points = append(points, *xR) indices = append(indices, i) k := strat[sidx] sidx++ op.Pow3k(xR, &cparam, k) i += int(k) } cparam = phi.GenerateCurve(xR) for k := 0; k < len(points); k++ { points[k] = phi.EvaluatePoint(&points[k]) } // pop xR from points *xR, points = points[len(points)-1], points[:len(points)-1] i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] } } // Generate a public key in the 2-torsion group func publicKeyGenA(prv *PrivateKey) (pub *PublicKey) { var xPA, xQA, xRA ProjectivePoint var xPB, xQB, xRB, xR ProjectivePoint var invZP, invZQ, invZR Fp2Element var tmp ProjectiveCurveParameters pub = NewPublicKey(prv.params.Id, KeyVariant_SIDH_A) var op = CurveOperations{Params: pub.params} var phi = Newisogeny4(op.Params.Op) // Load points for A xPA = ProjectivePoint{X: prv.params.A.Affine_P, Z: prv.params.OneFp2} xQA = ProjectivePoint{X: prv.params.A.Affine_Q, Z: prv.params.OneFp2} xRA = ProjectivePoint{X: prv.params.A.Affine_R, Z: prv.params.OneFp2} // Load points for B xRB = ProjectivePoint{X: prv.params.B.Affine_R, Z: prv.params.OneFp2} xQB = ProjectivePoint{X: prv.params.B.Affine_Q, Z: prv.params.OneFp2} xPB = ProjectivePoint{X: prv.params.B.Affine_P, Z: prv.params.OneFp2} // Find isogeny kernel tmp.C = pub.params.OneFp2 xR = op.ScalarMul3Pt(&tmp, &xPA, &xQA, &xRA, prv.params.A.SecretBitLen, prv.Scalar) // Reset params object and travers isogeny tree tmp.C = pub.params.OneFp2 tmp.A.Zeroize() traverseTreePublicKeyA(&tmp, &xR, &xPB, &xQB, &xRB, pub) // Secret isogeny phi.GenerateCurve(&xR) xPA = phi.EvaluatePoint(&xPB) xQA = phi.EvaluatePoint(&xQB) xRA = phi.EvaluatePoint(&xRB) op.Fp2Batch3Inv(&xPA.Z, &xQA.Z, &xRA.Z, &invZP, &invZQ, &invZR) op.Params.Op.Mul(&pub.affine_xP, &xPA.X, &invZP) op.Params.Op.Mul(&pub.affine_xQ, &xQA.X, &invZQ) op.Params.Op.Mul(&pub.affine_xQmP, &xRA.X, &invZR) return } // Generate a public key in the 3-torsion group func publicKeyGenB(prv *PrivateKey) (pub *PublicKey) { var xPB, xQB, xRB, xR ProjectivePoint var xPA, xQA, xRA ProjectivePoint var invZP, invZQ, invZR Fp2Element var tmp ProjectiveCurveParameters pub = NewPublicKey(prv.params.Id, prv.keyVariant) var op = CurveOperations{Params: pub.params} var phi = Newisogeny3(op.Params.Op) // Load points for B xRB = ProjectivePoint{X: prv.params.B.Affine_R, Z: prv.params.OneFp2} xQB = ProjectivePoint{X: prv.params.B.Affine_Q, Z: prv.params.OneFp2} xPB = ProjectivePoint{X: prv.params.B.Affine_P, Z: prv.params.OneFp2} // Load points for A xPA = ProjectivePoint{X: prv.params.A.Affine_P, Z: prv.params.OneFp2} xQA = ProjectivePoint{X: prv.params.A.Affine_Q, Z: prv.params.OneFp2} xRA = ProjectivePoint{X: prv.params.A.Affine_R, Z: prv.params.OneFp2} tmp.C = pub.params.OneFp2 xR = op.ScalarMul3Pt(&tmp, &xPB, &xQB, &xRB, prv.params.B.SecretBitLen, prv.Scalar) tmp.C = pub.params.OneFp2 tmp.A.Zeroize() traverseTreePublicKeyB(&tmp, &xR, &xPA, &xQA, &xRA, pub) phi.GenerateCurve(&xR) xPB = phi.EvaluatePoint(&xPA) xQB = phi.EvaluatePoint(&xQA) xRB = phi.EvaluatePoint(&xRA) op.Fp2Batch3Inv(&xPB.Z, &xQB.Z, &xRB.Z, &invZP, &invZQ, &invZR) op.Params.Op.Mul(&pub.affine_xP, &xPB.X, &invZP) op.Params.Op.Mul(&pub.affine_xQ, &xQB.X, &invZQ) op.Params.Op.Mul(&pub.affine_xQmP, &xRB.X, &invZR) return } // ----------------------------------------------------------------------------- // Key agreement functions // // Establishing shared keys in in 2-torsion group func deriveSecretA(prv *PrivateKey, pub *PublicKey) []byte { var sharedSecret = make([]byte, pub.params.SharedSecretSize) var cparam ProjectiveCurveParameters var xP, xQ, xQmP ProjectivePoint var xR ProjectivePoint var op = CurveOperations{Params: prv.params} var phi = Newisogeny4(op.Params.Op) // Recover curve coefficients cparam.C = pub.params.OneFp2 op.RecoverCoordinateA(&cparam, &pub.affine_xP, &pub.affine_xQ, &pub.affine_xQmP) // Find kernel of the morphism xP = ProjectivePoint{X: pub.affine_xP, Z: pub.params.OneFp2} xQ = ProjectivePoint{X: pub.affine_xQ, Z: pub.params.OneFp2} xQmP = ProjectivePoint{X: pub.affine_xQmP, Z: pub.params.OneFp2} xR = op.ScalarMul3Pt(&cparam, &xP, &xQ, &xQmP, pub.params.A.SecretBitLen, prv.Scalar) // Traverse isogeny tree traverseTreeSharedKeyA(&cparam, &xR, pub) // Calculate j-invariant on isogeneus curve c := phi.GenerateCurve(&xR) op.RecoverCurveCoefficients4(&cparam, &c) op.Jinvariant(&cparam, sharedSecret) return sharedSecret } // Establishing shared keys in in 3-torsion group func deriveSecretB(prv *PrivateKey, pub *PublicKey) []byte { var sharedSecret = make([]byte, pub.params.SharedSecretSize) var xP, xQ, xQmP ProjectivePoint var xR ProjectivePoint var cparam ProjectiveCurveParameters var op = CurveOperations{Params: prv.params} var phi = Newisogeny3(op.Params.Op) // Recover curve coefficients cparam.C = pub.params.OneFp2 op.RecoverCoordinateA(&cparam, &pub.affine_xP, &pub.affine_xQ, &pub.affine_xQmP) // Find kernel of the morphism xP = ProjectivePoint{X: pub.affine_xP, Z: pub.params.OneFp2} xQ = ProjectivePoint{X: pub.affine_xQ, Z: pub.params.OneFp2} xQmP = ProjectivePoint{X: pub.affine_xQmP, Z: pub.params.OneFp2} xR = op.ScalarMul3Pt(&cparam, &xP, &xQ, &xQmP, pub.params.B.SecretBitLen, prv.Scalar) // Traverse isogeny tree traverseTreeSharedKeyB(&cparam, &xR, pub) // Calculate j-invariant on isogeneus curve c := phi.GenerateCurve(&xR) op.RecoverCurveCoefficients3(&cparam, &c) op.Jinvariant(&cparam, sharedSecret) return sharedSecret } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/sidh/sidh_test.go000066400000000000000000000376121343600534300251020ustar00rootroot00000000000000package sidh import ( "bytes" "crypto/rand" "encoding/hex" "fmt" "math/big" "testing" . "github.com/cloudflare/sidh/internal/isogeny" ) /* ------------------------------------------------------------------------- Test data -------------------------------------------------------------------------*/ var tdata = map[uint8]struct { name string PkA string PrA string PkB string PrB string }{ FP_503: { name: "P-503", PrA: "B0AD510708F4ABCF3E0D97DC2F2FF112D9D2AAE49D97FFD1E4267F21C6E71C03", PrB: "A885A8B889520A6DBAD9FB33365E5B77FDED629440A16A533F259A510F63A822", PkA: "A6BADBA04518A924B20046B59AC197DCDF0EA48014C9E228C4994CCA432F360E" + "2D527AFB06CA7C96EE5CEE19BAD53BF9218A3961CAD7EC092BD8D9EBB22A3D51" + "33008895A3F1F6A023F91E0FE06A00A622FD6335DAC107F8EC4283DC2632F080" + "4E64B390DAD8A2572F1947C67FDF4F8787D140CE2C6B24E752DA9A195040EDFA" + "C27333FAE97DBDEB41DA9EEB2DB067AE7DA8C58C0EF57AEFC18A3D6BD0576FF2" + "F1CFCAEC50C958331BF631F3D2E769790C7B6DF282B74BBC02998AD10F291D47" + "C5A762FF84253D3B3278BDF20C8D4D4AA317BE401B884E26A1F02C7308AADB68" + "20EBDB0D339F5A63346F3B40CACED72F544DAF51566C6E807D0E6E1E38514342" + "432661DC9564DA07548570E256688CD9E8060D8775F95D501886D958588CACA0" + "9F2D2AE1913F996E76AF63E31A179A7A7D2A46EDA03B2BCCF9020A5AA15F9A28" + "9340B33F3AE7F97360D45F8AE1B9DD48779A57E8C45B50A02C00349CD1C58C55" + "1D68BC2A75EAFED944E8C599C288037181E997471352E24C952B", PkB: "244AF1F367C2C33912750A98497CC8214BC195BD52BD76513D32ACE4B75E31F0" + "281755C265F5565C74E3C04182B9C244071859C8588CC7F09547CEFF8F7705D2" + "60CE87D6BFF914EE7DBE4B9AF051CA420062EEBDF043AF58184495026949B068" + "98A47046BFAE8DF3B447746184AF550553BB5D266D6E1967ACA33CAC5F399F90" + "360D70867F2C71EF6F94FF915C7DA8BC9549FB7656E691DAEFC93CF56876E482" + "CA2F8BE2D6CDCC374C31AD8833CABE997CC92305F38497BEC4DFD1821B004FEC" + "E16448F9A24F965EFE409A8939EEA671633D9FFCF961283E59B8834BDF7EDDB3" + "05D6275B61DA6692325432A0BAA074FC7C1F51E76208AB193A57520D40A76334" + "EE5712BDC3E1EFB6103966F2329EDFF63082C4DFCDF6BE1C5A048630B81871B8" + "83B735748A8FD4E2D9530C272163AB18105B10015CA7456202FE1C9B92CEB167" + "5EAE1132E582C88E47ED87B363D45F05BEA714D5E9933D7AF4071CBB5D49008F" + "3E3DAD7DFF935EE509D5DE561842B678CCEB133D62E270E9AC3E", }, FP_751: { name: "P-751", // PrA - Alice's Private Key: 2*randint(0,2^371) PrA: "C09957CC83045FB4C3726384D784476ACB6FFD92E5B15B3C2D451BA063F1BD4CED8FBCF682A98DD0954D3" + "7BCAF730E", // PrB - Bob's Private Key: 3*randint(0,3^238) PrB: "393E8510E78A16D2DC1AACA9C9D17E7E78DB630881D8599C7040D05BB5557ECAE8165C45D5366ECB37B00" + "969740AF201", PkA: "74D8EF08CB74EC99BF08B6FBE4FB3D048873B67F018E44988B9D70C564D058401D20E093C7DF0C66F022C" + "823E5139D2EA0EE137804B4820E950B046A90B0597759A0B6A197C56270128EA089FA1A2007DDE3430B37" + "A3E6350BD47B7F513863741C125FA63DEDAFC475C13DB59E533055B7CBE4B2F32672DF2DF97E03E29617B" + "0E9B6A35B58ABB26527A721142701EB147C7050E1D9125DA577B08CD51C8BB50627B8B47FACFC9C7C07DD" + "00DD75115DD83719FD5F96115DED23ECAA50B1044C6BF3F27442DA284BA4A272D850F414FB185801BF2EF" + "7E628EDB5643E35694B992CF30A2C5120CAF9434F09ACFCA3645B3FFC3A308901FAC7B8955FD5C98576AE" + "FD03F5806CB7430F75B3431B75BEC080596ABCA26E637E6E8D4C25175A8C052C9CBE77900A863F83FAB00" + "95B32D9C3858EF8A35B9F163D429E71DBA47539EB4791D117FE39DDE94EA7801A42DB12D84DE4740ACF51" + "CD7C32BB854569D7D94E11E69D9663CC7ED02E78CF48F4069DF3D3E86198B307095C6B11D46C0DC849F9D" + "94C7693209E5B3848AFAA6DA6A8D73362D779CBC43515902ED2BCE3A748C537DE2FCF092FD3E91B790AF5" + "4E1092C5E5B89BE5BE23B955A52F769D97277EF69F820109042F28C316AC90AE69EB374C9280300B816E6" + "2494B2E01072D1CA96E4B284D2BE1368D6969744B614FACBC8C165864E26E33481D4FDC47B6E523954A25" + "C1A096A37CD23FB81AE64FB11BD0A439609F1CE40673B06DD96F698A910E935219D840F3D411EDFB00D98" + "065AB9868C32D3DA05FF415", PkB: "F6C260C4141E418457CB442E11F0F5558375437576E55D211D19EF83E2839E51D07A82765D8E7B6366FA7" + "0B56CDE3AD3B629ACF542A433369496EDA51EDFBE16EFA1B8DEE1CE46B37820ECBD0CD674AACD4F21FABC" + "2436651E3AF604356FF3EB2CA87976890E34A56FAEC9A2ACD9559B1BB67B69AC1A521342E1E787DA5D709" + "32B0F5842ECA1C99B269DB6C2ED8397F0FC49F114CF8B5AF327A698C0251575CDD1D67732668109A91A3B" + "FA5B47D413C7FAB8817FCBEBFE9BDD9C0B1F3B1934A7028A65233E8B58A92E7E9F66B68B2057ECBF7E44A" + "0EF6EFCC3C8AA5414E100FA0C24F7545324AD17062FC11377A2A4749DEE27E192460E099DBDA8E840EA11" + "AD9D5C83DF065AF77030E7FE18CE24CFC71D356B9B9601811B93676C12CB6B41747133D5259E7A20CC065" + "FAB99DF944FDB34ABB9A374F9E9CC8F9C186BD2181DC2771F69C02629C3E4801A7E7C21F6F3CFF7D257E2" + "257C88C015F0CC8DC0E7FB3373CF4ED6A786AB329E7F16895CA147AD91F6EAE1DFE38116580DF52381599" + "E4246278CB1848FE4A56ABF98652E9E7C2E681551A3D78FA033D932087D8B6567D779A56B726B153033D7" + "2231A1B5C16ED7DC4458308D6B64AF6723CC0F52C94E04C58FCA9739E890AA40CC05E22321F10129D2B59" + "1F317102034C109A56D711591E5B44C717CFC9C9B9461894767CAFA42D2B394194B03999C2A9EF48868F3" + "FB03D1A40F596613AF97F4ED7643A1C2D12692E959C6DEB8E72403ADC0E42204DBCE5056EEF0CC60B0C6E" + "83B8B55AC01F6C85644EE49", }, } /* ------------------------------------------------------------------------- Helpers -------------------------------------------------------------------------*/ // Fail if err !=nil. Display msg as an error message func checkErr(t testing.TB, err error, msg string) { if err != nil { t.Error(msg) } } // Utility used for running same test with all registered prime fields type MultiIdTestingFunc func(testing.TB, uint8) func Do(f MultiIdTestingFunc, t testing.TB) { for id, val := range tdata { fmt.Printf("\tTesting: %s\n", val.name) f(t, id) } } // Converts string to private key func convToPrv(s string, v KeyVariant, id uint8) *PrivateKey { key := NewPrivateKey(id, v) hex, e := hex.DecodeString(s) if e != nil { panic("non-hex number provided") } e = key.Import(hex) if e != nil { panic("Can't import private key") } return key } // Converts string to public key func convToPub(s string, v KeyVariant, id uint8) *PublicKey { key := NewPublicKey(id, v) hex, e := hex.DecodeString(s) if e != nil { panic("non-hex number provided") } e = key.Import(hex) if e != nil { panic("Can't import public key") } return key } /* ------------------------------------------------------------------------- Unit tests -------------------------------------------------------------------------*/ func testKeygen(t testing.TB, id uint8) { alicePrivate := convToPrv(tdata[id].PrA, KeyVariant_SIDH_A, id) bobPrivate := convToPrv(tdata[id].PrB, KeyVariant_SIDH_B, id) expPubA := convToPub(tdata[id].PkA, KeyVariant_SIDH_A, id) expPubB := convToPub(tdata[id].PkB, KeyVariant_SIDH_B, id) pubA := alicePrivate.GeneratePublicKey() pubB := bobPrivate.GeneratePublicKey() if !bytes.Equal(pubA.Export(), expPubA.Export()) { t.Fatalf("unexpected value of public key A") } if !bytes.Equal(pubB.Export(), expPubB.Export()) { t.Fatalf("unexpected value of public key B") } } func testRoundtrip(t testing.TB, id uint8) { var err error prvA := NewPrivateKey(id, KeyVariant_SIDH_A) prvB := NewPrivateKey(id, KeyVariant_SIDH_B) // Generate private keys err = prvA.Generate(rand.Reader) checkErr(t, err, "key generation failed") err = prvB.Generate(rand.Reader) checkErr(t, err, "key generation failed") // Generate public keys pubA := prvA.GeneratePublicKey() pubB := prvB.GeneratePublicKey() // Derive shared secret s1, err := DeriveSecret(prvB, pubA) checkErr(t, err, "") s2, err := DeriveSecret(prvA, pubB) checkErr(t, err, "") if !bytes.Equal(s1[:], s2[:]) { t.Fatalf("Tthe two shared keys: \n%X, \n%X do not match", s1, s2) } } func testKeyAgreement(t testing.TB, id uint8, pkA, prA, pkB, prB string) { var e error // KeyPairs alicePublic := convToPub(pkA, KeyVariant_SIDH_A, id) bobPublic := convToPub(pkB, KeyVariant_SIDH_B, id) alicePrivate := convToPrv(prA, KeyVariant_SIDH_A, id) bobPrivate := convToPrv(prB, KeyVariant_SIDH_B, id) // Do actual test s1, e := DeriveSecret(bobPrivate, alicePublic) checkErr(t, e, "derivation s1") s2, e := DeriveSecret(alicePrivate, bobPublic) checkErr(t, e, "derivation s1") if !bytes.Equal(s1[:], s2[:]) { t.Fatalf("two shared keys: %d, %d do not match", s1, s2) } // Negative case dec, e := hex.DecodeString(tdata[id].PkA) if e != nil { t.FailNow() } dec[0] = ^dec[0] e = alicePublic.Import(dec) if e != nil { t.FailNow() } s1, e = DeriveSecret(bobPrivate, alicePublic) checkErr(t, e, "derivation of s1 failed") s2, e = DeriveSecret(alicePrivate, bobPublic) checkErr(t, e, "derivation of s2 failed") if bytes.Equal(s1[:], s2[:]) { t.Fatalf("The two shared keys: %d, %d match", s1, s2) } } func testImportExport(t testing.TB, id uint8) { var err error a := NewPublicKey(id, KeyVariant_SIDH_A) b := NewPublicKey(id, KeyVariant_SIDH_B) // Import keys a_hex, err := hex.DecodeString(tdata[id].PkA) checkErr(t, err, "invalid hex-number provided") err = a.Import(a_hex) checkErr(t, err, "import failed") b_hex, err := hex.DecodeString(tdata[id].PkB) checkErr(t, err, "invalid hex-number provided") err = b.Import(b_hex) checkErr(t, err, "import failed") // Export and check if same if !bytes.Equal(b.Export(), b_hex) || !bytes.Equal(a.Export(), a_hex) { t.Fatalf("export/import failed") } if (len(b.Export()) != b.Size()) || (len(a.Export()) != a.Size()) { t.Fatalf("wrong size of exported keys") } } func testPrivateKeyBelowMax(t testing.TB, id uint8) { params := Params(id) for variant, keySz := range map[KeyVariant]*DomainParams{ KeyVariant_SIDH_A: ¶ms.A, KeyVariant_SIDH_B: ¶ms.B} { func(v KeyVariant, dp *DomainParams) { var blen = int(dp.SecretByteLen) var prv = NewPrivateKey(id, v) // Calculate either (2^e2 - 1) or (2^s - 1); where s=ceil(log_2(3^e3))) maxSecertVal := big.NewInt(int64(dp.SecretBitLen)) maxSecertVal.Exp(big.NewInt(int64(2)), maxSecertVal, nil) maxSecertVal.Sub(maxSecertVal, big.NewInt(1)) // Do same test 1000 times for i := 0; i < 1000; i++ { err := prv.Generate(rand.Reader) checkErr(t, err, "Private key generation") // Convert to big-endian, as that's what expected by (*Int)SetBytes() secretBytes := prv.Export() for i := 0; i < int(blen/2); i++ { tmp := secretBytes[i] ^ secretBytes[blen-i-1] secretBytes[i] = tmp ^ secretBytes[i] secretBytes[blen-i-1] = tmp ^ secretBytes[blen-i-1] } prvBig := new(big.Int).SetBytes(secretBytes) // Check if generated key is bigger then acceptable if prvBig.Cmp(maxSecertVal) == 1 { t.Error("Generated private key is wrong") } } }(variant, keySz) } } func TestKeyAgreement(t *testing.T) { for id, val := range tdata { fmt.Printf("\tTesting: %s\n", val.name) testKeyAgreement(t, id, tdata[id].PkA, tdata[id].PrA, tdata[id].PkB, tdata[id].PrB) } } func TestKeyAgreementP751_AliceEvenNumber(t *testing.T) { // even alice prE := "C09957CC83045FB4C3726384D784476ACB6FFD92E5B15B3C2D451BA063F1BD4CED8FBCF682A98DD0954D37BCAF730F" pkE := "8A2DE6FD963C475F7829B689C8B8306FC0917A39EBBC35CA171546269A85698FEC0379E2E1A3C567BE1B8EF5639F81F304889737E6CC444DBED4579DB204DC8C7928F5CBB1ECDD682A1B5C48C0DAF34208C06BF201BE4E6063B1BFDC42413B0537F8E76BEE645C1A24118301BAB17EB8D6E0F283BCB16EFB833E4BB3463953C93165A0DDAC55B385059F27FF7228486D0A733812C81C792BE9EC3A16A5DB0EB099EEA76AC0E59612251A3AD19F7CC567DA2AEBD7733171F48E471D17648692355164E27B515D2A47D7BA34B3B48A047BE7C09C4ABEE2FCC9ACA7396C8A8C9E73E29533FC7369094DFA7988778E55E53F309922C6E233F8F9C7936C3D29CEA640406FCA06450AA1978FF39F227BF06B1E072F1763447C6F513B23CDF3B0EC0379070AEE5A02D9AD8E0EB023461D631F4A9643A4C79921334945F6B33DDFC11D9703BD06B047B4DA404AB12EFD2C3A49E5C42D10DA063352748B21DE41C32A5693FE1C0DCAB111F4990CD58BECADB1892EE7A7E99C9DB4DA4E69C96E57138B99038BC9B877ECE75914EFB98DD08B9E4A2DCCB948A8F7D2F26678A9952BA0EFAB1E9CF6E51B557480DEC2BA30DE0FE4AFE30A6B30765EE75EF64F678316D81C72755AD2CFA0B8C7706B07BFA52FBC3DB84EF9E79796C0089305B1E13C78660779E0FF2A13820CE141104F976B1678990F85B2D3D2B89CD5BC4DD52603A5D24D3EFEDA44BAA0F38CDB75A220AF45EAB70F2799875D435CE50FC6315EDD4BB7AA7260AFD7CD0561B69B4FA3A817904322661C3108DA24" testKeyAgreement(t, FP_751, pkE, prE, tdata[FP_751].PkB, tdata[FP_751].PrB) } /* ------------------------------------------------------------------------- Wrappers for 'testing' module -------------------------------------------------------------------------*/ func TestKeygen(t *testing.T) { Do(testKeygen, t) } func TestRoundtrip(t *testing.T) { Do(testRoundtrip, t) } func TestImportExport(t *testing.T) { Do(testImportExport, t) } /* ------------------------------------------------------------------------- Benchmarking -------------------------------------------------------------------------*/ func BenchmarkSidhKeyAgreementP751(b *testing.B) { // KeyPairs alicePublic := convToPub(tdata[FP_751].PkA, KeyVariant_SIDH_A, FP_751) bobPublic := convToPub(tdata[FP_751].PkB, KeyVariant_SIDH_B, FP_751) alicePrivate := convToPrv(tdata[FP_751].PrA, KeyVariant_SIDH_A, FP_751) bobPrivate := convToPrv(tdata[FP_751].PrB, KeyVariant_SIDH_B, FP_751) for i := 0; i < b.N; i++ { // Derive shared secret DeriveSecret(bobPrivate, alicePublic) DeriveSecret(alicePrivate, bobPublic) } } func BenchmarkSidhKeyAgreementP503(b *testing.B) { // KeyPairs alicePublic := convToPub(tdata[FP_503].PkA, KeyVariant_SIDH_A, FP_503) bobPublic := convToPub(tdata[FP_503].PkB, KeyVariant_SIDH_B, FP_503) alicePrivate := convToPrv(tdata[FP_503].PrA, KeyVariant_SIDH_A, FP_503) bobPrivate := convToPrv(tdata[FP_503].PrB, KeyVariant_SIDH_B, FP_503) for i := 0; i < b.N; i++ { // Derive shared secret DeriveSecret(bobPrivate, alicePublic) DeriveSecret(alicePrivate, bobPublic) } } func BenchmarkAliceKeyGenPrvP751(b *testing.B) { prv := NewPrivateKey(FP_751, KeyVariant_SIDH_A) for n := 0; n < b.N; n++ { prv.Generate(rand.Reader) } } func BenchmarkAliceKeyGenPrvP503(b *testing.B) { prv := NewPrivateKey(FP_503, KeyVariant_SIDH_A) for n := 0; n < b.N; n++ { prv.Generate(rand.Reader) } } func BenchmarkBobKeyGenPrvP751(b *testing.B) { prv := NewPrivateKey(FP_751, KeyVariant_SIDH_B) for n := 0; n < b.N; n++ { prv.Generate(rand.Reader) } } func BenchmarkBobKeyGenPrvP503(b *testing.B) { prv := NewPrivateKey(FP_503, KeyVariant_SIDH_B) for n := 0; n < b.N; n++ { prv.Generate(rand.Reader) } } func BenchmarkAliceKeyGenPubP751(b *testing.B) { prv := NewPrivateKey(FP_751, KeyVariant_SIDH_A) prv.Generate(rand.Reader) for n := 0; n < b.N; n++ { prv.GeneratePublicKey() } } func BenchmarkAliceKeyGenPubP503(b *testing.B) { prv := NewPrivateKey(FP_503, KeyVariant_SIDH_A) prv.Generate(rand.Reader) for n := 0; n < b.N; n++ { prv.GeneratePublicKey() } } func BenchmarkBobKeyGenPubP751(b *testing.B) { prv := NewPrivateKey(FP_751, KeyVariant_SIDH_B) prv.Generate(rand.Reader) for n := 0; n < b.N; n++ { prv.GeneratePublicKey() } } func BenchmarkBobKeyGenPubP503(b *testing.B) { prv := NewPrivateKey(FP_503, KeyVariant_SIDH_B) prv.Generate(rand.Reader) for n := 0; n < b.N; n++ { prv.GeneratePublicKey() } } func BenchmarkSharedSecretAliceP751(b *testing.B) { aPr := convToPrv(tdata[FP_751].PrA, KeyVariant_SIDH_A, FP_751) bPk := convToPub(tdata[FP_751].PkB, KeyVariant_SIDH_B, FP_751) for n := 0; n < b.N; n++ { DeriveSecret(aPr, bPk) } } func BenchmarkSharedSecretAliceP503(b *testing.B) { aPr := convToPrv(tdata[FP_503].PrA, KeyVariant_SIDH_A, FP_503) bPk := convToPub(tdata[FP_503].PkB, KeyVariant_SIDH_B, FP_503) for n := 0; n < b.N; n++ { DeriveSecret(aPr, bPk) } } func BenchmarkSharedSecretBobP751(b *testing.B) { // m_B = 3*randint(0,3^238) aPk := convToPub(tdata[FP_751].PkA, KeyVariant_SIDH_A, FP_751) bPr := convToPrv(tdata[FP_751].PrB, KeyVariant_SIDH_B, FP_751) for n := 0; n < b.N; n++ { DeriveSecret(bPr, aPk) } } func BenchmarkSharedSecretBobP503(b *testing.B) { // m_B = 3*randint(0,3^238) aPk := convToPub(tdata[FP_503].PkA, KeyVariant_SIDH_A, FP_503) bPr := convToPrv(tdata[FP_503].PrB, KeyVariant_SIDH_B, FP_503) for n := 0; n < b.N; n++ { DeriveSecret(bPr, aPk) } } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/sike/000077500000000000000000000000001343600534300225605ustar00rootroot00000000000000golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/sike/sike.go000066400000000000000000000141231343600534300240430ustar00rootroot00000000000000// [SIKE] http://www.sike.org/files/SIDH-spec.pdf // [REF] https://github.com/Microsoft/PQCrypto-SIDH package sike import ( "crypto/subtle" "errors" "io" // TODO: Use implementation from xcrypto, once PR below merged // https://go-review.googlesource.com/c/crypto/+/111281/ . "github.com/cloudflare/sidh/sidh" cshake "github.com/henrydcase/nobs/hash/sha3" ) // Constants used for cSHAKE customization // Those values are different than in [SIKE] - they are encoded on 16bits. This is // done in order for implementation to be compatible with [REF] and test vectors. var G = []byte{0x00, 0x00} var H = []byte{0x01, 0x00} var F = []byte{0x02, 0x00} // Generates cShake-256 sum func cshakeSum(out, in, S []byte) { h := cshake.NewCShake256(nil, S) h.Write(in) h.Read(out) } func encrypt(skA *PrivateKey, pkA, pkB *PublicKey, ptext []byte) ([]byte, error) { var n [40]byte // n can is max 320-bit (see 1.4 of [SIKE]) var ptextLen = len(ptext) if pkB.Variant() != KeyVariant_SIKE { return nil, errors.New("wrong key type") } j, err := DeriveSecret(skA, pkB) if err != nil { return nil, err } cshakeSum(n[:ptextLen], j, F) for i, _ := range ptext { n[i] ^= ptext[i] } ret := make([]byte, pkA.Size()+ptextLen) copy(ret, pkA.Export()) copy(ret[pkA.Size():], n[:ptextLen]) return ret, nil } // ----------------------------------------------------------------------------- // PKE interface // // Uses SIKE public key to encrypt plaintext. Requires cryptographically secure PRNG // Returns ciphertext in case encryption succeeds. Returns error in case PRNG fails // or wrongly formated input was provided. func Encrypt(rng io.Reader, pub *PublicKey, ptext []byte) ([]byte, error) { var params = pub.Params() var ptextLen = len(ptext) // c1 must be security level + 64 bits (see [SIKE] 1.4 and 4.3.3) if ptextLen != (params.KemSize + 8) { return nil, errors.New("Unsupported message length") } skA := NewPrivateKey(params.Id, KeyVariant_SIDH_A) err := skA.Generate(rng) if err != nil { return nil, err } pkA := skA.GeneratePublicKey() return encrypt(skA, pkA, pub, ptext) } // Uses SIKE private key to decrypt ciphertext. Returns plaintext in case // decryption succeeds or error in case unexptected input was provided. // Constant time func Decrypt(prv *PrivateKey, ctext []byte) ([]byte, error) { var params = prv.Params() var n [40]byte // n can is max 320-bit (see 1.4 of [SIKE]) var c1_len int var pk_len = params.PublicKeySize if prv.Variant() != KeyVariant_SIKE { return nil, errors.New("wrong key type") } // ctext is a concatenation of (pubkey_A || c1=ciphertext) // it must be security level + 64 bits (see [SIKE] 1.4 and 4.3.3) c1_len = len(ctext) - pk_len if c1_len != (int(params.KemSize) + 8) { return nil, errors.New("wrong size of cipher text") } c0 := NewPublicKey(params.Id, KeyVariant_SIDH_A) err := c0.Import(ctext[:pk_len]) if err != nil { return nil, err } j, err := DeriveSecret(prv, c0) if err != nil { return nil, err } cshakeSum(n[:c1_len], j, F) for i, _ := range n[:c1_len] { n[i] ^= ctext[pk_len+i] } return n[:c1_len], nil } // ----------------------------------------------------------------------------- // KEM interface // // Encapsulation receives the public key and generates SIKE ciphertext and shared secret. // The generated ciphertext is used for authentication. // The rng must be cryptographically secure PRNG. // Error is returned in case PRNG fails or wrongly formated input was provided. func Encapsulate(rng io.Reader, pub *PublicKey) (ctext []byte, secret []byte, err error) { var params = pub.Params() // Buffer for random, secret message var ptext = make([]byte, params.MsgLen) // r = G(ptext||pub) var r = make([]byte, params.A.SecretByteLen) // Resulting shared secret secret = make([]byte, params.KemSize) // Generate ephemeral value _, err = io.ReadFull(rng, ptext) if err != nil { return nil, nil, err } h := cshake.NewCShake256(nil, G) h.Write(ptext) h.Write(pub.Export()) h.Read(r) // cSHAKE256 implementation is byte oriented. Ensure bitlength is not bigger then to 2^e2-1 r[len(r)-1] &= (1 << (params.A.SecretBitLen % 8)) - 1 // (c0 || c1) = Enc(pkA, ptext; r) skA := NewPrivateKey(params.Id, KeyVariant_SIDH_A) err = skA.Import(r) if err != nil { return nil, nil, err } pkA := skA.GeneratePublicKey() ctext, err = encrypt(skA, pkA, pub, ptext) if err != nil { return nil, nil, err } // K = H(ptext||(c0||c1)) h = cshake.NewCShake256(nil, H) h.Write(ptext) h.Write(ctext) h.Read(secret) return ctext, secret, nil } // Decapsulate given the keypair and ciphertext as inputs, Decapsulate outputs a shared // secret if plaintext verifies correctly, otherwise function outputs random value. // Decapsulation may fail in case input is wrongly formated. // Constant time for properly initialized input. func Decapsulate(prv *PrivateKey, pub *PublicKey, ctext []byte) ([]byte, error) { var params = pub.Params() var r = make([]byte, params.A.SecretByteLen) // Resulting shared secret var secret = make([]byte, params.KemSize) var skA = NewPrivateKey(params.Id, KeyVariant_SIDH_A) m, err := Decrypt(prv, ctext) if err != nil { return nil, err } // r' = G(m'||pub) h := cshake.NewCShake256(nil, G) h.Write(m) h.Write(pub.Export()) h.Read(r) // cSHAKE256 implementation is byte oriented: Ensure bitlength is not bigger than 2^e2-1 r[len(r)-1] &= (1 << (params.A.SecretBitLen % 8)) - 1 // Never fails skA.Import(r) // Never fails pkA := skA.GeneratePublicKey() c0 := pkA.Export() h = cshake.NewCShake256(nil, H) if subtle.ConstantTimeCompare(c0, ctext[:len(c0)]) == 1 { h.Write(m) } else { // S is chosen at random when generating a key and unknown to other party. It // may seem weird, but it's correct. It is important that S is unpredictable // to other party. Without this check, it is possible to recover a secret, by // providing series of invalid ciphertexts. It is also important that in case // // See more details in "On the security of supersingular isogeny cryptosystems" // (S. Galbraith, et al., 2016, ePrint #859). h.Write(prv.S) } h.Write(ctext) h.Read(secret) return secret, nil } golang-github-cloudflare-sidh-1.0+git20190228.d2f0f90/sike/sike_test.go000066400000000000000000000266021343600534300251070ustar00rootroot00000000000000package sike import ( "testing" "bufio" "bytes" "encoding/hex" "io" "os" "strings" "fmt" rand "crypto/rand" . "github.com/cloudflare/sidh/sidh" ) type MultiIdTestingFunc func(*testing.T, uint8) func Do(f MultiIdTestingFunc, t *testing.T) { for id, val := range tdata { fmt.Printf("\tTesting: %s\n", val.name) f(t, id) } } var tdata = map[uint8]struct { name string KatFile string PkB string PrB string }{ FP_503: { "P-503", "../etc/PQCkemKAT_434.rsp", "68460C22466E95864CFEA7B5D9077E768FF4F9ED69AE56D7CF3F236FB06B31020EEE34B5B572CEA5DDF20B531966AA8F5F3ACC0C6D1CE04EEDC30FD1F1233E2D96FE60C6D638FC646EAF2E2246F1AEC96859CE874A1F029A78F9C978CD6B22114A0D5AB20101191FD923E80C76908B1498B9D0200065CCA09159A0C65A1E346CC6470314FE78388DAA89DD08EC67DBE63C1F606674ACC49EBF9FDBB2B898B3CE733113AA6F942DB401A76D629CE6EE6C0FDAF4CFB1A5E366DB66C17B3923A1B7FB26A3FF25B9018869C674D3DEF4AF269901D686FE4647F9D2CDB2CEB3AFA305B27C885F037ED167F595066C21E7DD467D8332B934A5102DA5F13332DFA356B82156A0BB2E7E91C6B85B7D1E381BC9E3F0FC4DB9C36016D9ECEC415D7E977E9AC29910D934BA2FE4EE49D3B387607A4E1AFABF495FB86A77194626589E802FF5167C7A25C542C1EAD25A6E0AA931D94F2F9AFD3DBDF222E651F729A90E77B20974905F1E65E041CE6C95AAB3E1F22D332E0A5DE9C5DB3D9C7A38", "80FC55DA74DEFE3113487B80841E678AF9ED4E0599CF07353A4AB93971C090A0A9402C9DC98AC6DC8F5FDE5E970AE22BA48A400EFC72851C"}, FP_751: { "P-751", "../etc/PQCkemKAT_644.rsp", "7C55E268665504B9A11A1B30B4363A4957960AD015A7B74DF39FB0141A95CC51A4BEBBB48452EF0C881220D68CB5FF904C0549F05F06BF49A520E684DD610A7E121B420C751B789BDCDB8B6EC136BA0CE74EB6904906057EA7343839EA35FAF2C3D7BE76C81DCA4DF0850CE5F111FF9FF97242EC5520310D7F90A004BACFD75408CBFE8948232A9CCF035136DE3691D9BEF110C3081AADF0D2328CE2CC94998D8AE94D6575083FAFA045F50201FCE841D01C214CC8BBEFCC701484215EA70518204C76A0DA89BEAF0B066F6FD9E78A2C908CF0AFF74E0B55477190F918397F0CF3A537B7911DA846196AD914114A15C2F3C1062D78B19D23348C3D3D4A9C2B2018B382CC44544DA2FA263EB6212D2D13F254216DE002D4AEA55C75C5349A681D7A809BCC29C4CAE1168AC790321FF7429FAAC2FC09465F93E10B9DD970901A1B1D045DDAC9D7B901E00F29AA9F2C87C8EF848E80B7B290ECF85D6BB4C7E975A939A7AFB63069F900A75C9B7B71C2E7472C21A87AB604B6372D4EBEC5974A711281A819636D8FA3E6608F2B81F35599BBB4A1EB5CBD8F743587550F8CE3A809F5C9C399DD52B2D15F217A36F3218C772FD4E67F67D526DEBE1D31FEC4634927A873A1A6CFE55FF1E35AB72EBBD22E3CDD9D2640813345015BB6BD25A6977D0391D4D78998DD178155FEBF247BED3A9F83EAF3346BA90098B908B2359B60491C94330626709D235D1CFB7C87DCA779CFBA23DA280DC06FAEA0FDB3773B0C6391F889D803B7C04AC6AB27375B440336789823176C57", "00010203040506070809000102030405060708090001020304050607080901028626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB8FAB0A7289852106E40538D3575C500201"}, } // Fail if err !=nil. Display msg as an error message func checkErr(t testing.TB, err error, msg string) { if err != nil { t.Errorf("%s [%s]", msg, err) } } // Encrypt, Decrypt, check if input/output plaintext is the same func testPKERoundTrip(t *testing.T, id uint8) { // Message to be encrypted var params = Params(id) var msg = make([]byte, params.MsgLen) for i, _ := range msg { msg[i] = byte(i) } // Import keys pkB := NewPublicKey(params.Id, KeyVariant_SIKE) skB := NewPrivateKey(params.Id, KeyVariant_SIKE) pk_hex, err := hex.DecodeString(tdata[id].PkB) if err != nil { t.Fatal(err) } sk_hex, err := hex.DecodeString(tdata[id].PrB) if err != nil { t.Fatal(err) } if pkB.Import(pk_hex) != nil || skB.Import(sk_hex) != nil { t.Error("Import") } ct, err := Encrypt(rand.Reader, pkB, msg[:]) if err != nil { t.Fatal(err) } pt, err := Decrypt(skB, ct) if err != nil { t.Fatal(err) } if !bytes.Equal(pt[:], msg[:]) { t.Errorf("Decryption failed \n got : %X\n exp : %X", pt, msg) } } // Generate key and check if can encrypt func testPKEKeyGeneration(t *testing.T, id uint8) { // Message to be encrypted var params = Params(id) var msg = make([]byte, params.MsgLen) var err error for i, _ := range msg { msg[i] = byte(i) } sk := NewPrivateKey(id, KeyVariant_SIKE) err = sk.Generate(rand.Reader) checkErr(t, err, "PEK key generation") pk := sk.GeneratePublicKey() // Try to encrypt ct, err := Encrypt(rand.Reader, pk, msg[:]) checkErr(t, err, "PEK encryption") pt, err := Decrypt(sk, ct) checkErr(t, err, "PEK key decryption") if !bytes.Equal(pt[:], msg[:]) { t.Fatalf("Decryption failed \n got : %X\n exp : %X", pt, msg) } } func testNegativePKE(t *testing.T, id uint8) { var msg [40]byte var err error var params = Params(id) // Generate key sk := NewPrivateKey(params.Id, KeyVariant_SIKE) err = sk.Generate(rand.Reader) checkErr(t, err, "key generation") pk := sk.GeneratePublicKey() // bytelen(msg) - 1 ct, err := Encrypt(rand.Reader, pk, msg[:params.KemSize+8-1]) if err == nil { t.Fatal("Error hasn't been returned") } if ct != nil { t.Fatal("Ciphertext must be nil") } // KemSize - 1 pt, err := Decrypt(sk, msg[:params.KemSize+8-1]) if err == nil { t.Fatal("Error hasn't been returned") } if pt != nil { t.Fatal("Ciphertext must be nil") } } func testKEMRoundTrip(t *testing.T, pkB, skB []byte, id uint8) { // Import keys pk := NewPublicKey(id, KeyVariant_SIKE) sk := NewPrivateKey(id, KeyVariant_SIKE) if pk.Import(pkB) != nil || sk.Import(skB) != nil { t.Error("Import failed") } ct, ss_e, err := Encapsulate(rand.Reader, pk) if err != nil { t.Error("Encapsulate failed") } ss_d, err := Decapsulate(sk, pk, ct) if err != nil { t.Error("Decapsulate failed") } if !bytes.Equal(ss_e, ss_d) { t.Error("Shared secrets from decapsulation and encapsulation differ") } } func TestKEMRoundTrip(t *testing.T) { for id, val := range tdata { fmt.Printf("\tTesting: %s\n", val.name) pk, err := hex.DecodeString(tdata[id].PkB) checkErr(t, err, "public key B not a number") sk, err := hex.DecodeString(tdata[id].PrB) checkErr(t, err, "private key B not a number") testKEMRoundTrip(t, pk, sk, id) } } func testKEMKeyGeneration(t *testing.T, id uint8) { // Generate key sk := NewPrivateKey(id, KeyVariant_SIKE) checkErr(t, sk.Generate(rand.Reader), "error: key generation") pk := sk.GeneratePublicKey() // calculated shared secret ct, ss_e, err := Encapsulate(rand.Reader, pk) checkErr(t, err, "encapsulation failed") ss_d, err := Decapsulate(sk, pk, ct) checkErr(t, err, "decapsulation failed") if !bytes.Equal(ss_e, ss_d) { t.Fatalf("KEM failed \n encapsulated: %X\n decapsulated: %X", ss_d, ss_e) } } func testNegativeKEM(t *testing.T, id uint8) { sk := NewPrivateKey(id, KeyVariant_SIKE) checkErr(t, sk.Generate(rand.Reader), "error: key generation") pk := sk.GeneratePublicKey() ct, ss_e, err := Encapsulate(rand.Reader, pk) checkErr(t, err, "pre-requisite for a test failed") ct[0] = ct[0] - 1 ss_d, err := Decapsulate(sk, pk, ct) checkErr(t, err, "decapsulation returns error when invalid ciphertext provided") if bytes.Equal(ss_e, ss_d) { // no idea how this could ever happen, but it would be very bad t.Error("critical error") } // Try encapsulating with SIDH key pkSidh := NewPublicKey(id, KeyVariant_SIDH_B) prSidh := NewPrivateKey(id, KeyVariant_SIDH_B) _, _, err = Encapsulate(rand.Reader, pkSidh) if err == nil { t.Error("encapsulation accepts SIDH public key") } // Try decapsulating with SIDH key _, err = Decapsulate(prSidh, pk, ct) if err == nil { t.Error("decapsulation accepts SIDH private key key") } } // In case invalid ciphertext is provided, SIKE's decapsulation must // return same (but unpredictable) result for a given key. func testNegativeKEMSameWrongResult(t *testing.T, id uint8) { sk := NewPrivateKey(id, KeyVariant_SIKE) checkErr(t, sk.Generate(rand.Reader), "error: key generation") pk := sk.GeneratePublicKey() ct, encSs, err := Encapsulate(rand.Reader, pk) checkErr(t, err, "pre-requisite for a test failed") // make ciphertext wrong ct[0] = ct[0] - 1 decSs1, err := Decapsulate(sk, pk, ct) checkErr(t, err, "pre-requisite for a test failed") // second decapsulation must be done with same, but imported private key expSk := sk.Export() // creat new private key sk = NewPrivateKey(id, KeyVariant_SIKE) err = sk.Import(expSk) checkErr(t, err, "import failed") // try decapsulating again. ss2 must be same as ss1 and different than // original plaintext decSs2, err := Decapsulate(sk, pk, ct) checkErr(t, err, "pre-requisite for a test failed") if !bytes.Equal(decSs1, decSs2) { t.Error("decapsulation is insecure") } if bytes.Equal(encSs, decSs1) || bytes.Equal(encSs, decSs2) { // this test requires that decapsulation returns wrong result t.Errorf("test implementation error") } } func readAndCheckLine(r *bufio.Reader) []byte { // Read next line from buffer line, isPrefix, err := r.ReadLine() if err != nil || isPrefix { panic("Wrong format of input file") } // Function expects that line is in format "KEY = HEX_VALUE". Get // value, which should be a hex string hexst := strings.Split(string(line), "=")[1] hexst = strings.TrimSpace(hexst) // Convert value to byte string ret, err := hex.DecodeString(hexst) if err != nil { panic("Wrong format of input file") } return ret } func testKeygen(pk, sk []byte, id uint8) bool { // Import provided private key var prvKey = NewPrivateKey(id, KeyVariant_SIKE) if prvKey.Import(sk) != nil { panic("sike test: can't load KAT") } // Generate public key pubKey := prvKey.GeneratePublicKey() return bytes.Equal(pubKey.Export(), pk) } func testDecapsulation(pk, sk, ct, ssExpected []byte, id uint8) bool { var pubKey = NewPublicKey(id, KeyVariant_SIKE) var prvKey = NewPrivateKey(id, KeyVariant_SIKE) if pubKey.Import(pk) != nil || prvKey.Import(sk) != nil { panic("sike test: can't load KAT") } ssGot, err := Decapsulate(prvKey, pubKey, ct) if err != nil { panic("sike test: can't perform decapsulation KAT") } if err != nil { return false } return bytes.Equal(ssGot, ssExpected) } func testSIKE_KAT(t *testing.T, id uint8) { params := Params(id) f, err := os.Open(tdata[id].KatFile) if err != nil { t.Fatal(err) } r := bufio.NewReader(f) for { line, isPrefix, err := r.ReadLine() if err != nil || isPrefix { if err == io.EOF { break } else { t.Fatal(err) } } if len(strings.TrimSpace(string(line))) == 0 || line[0] == '#' { continue } // count count := strings.Split(string(line), "=")[1] // seed _ = readAndCheckLine(r) // pk pk := readAndCheckLine(r) // sk (secret key in test vector is concatenation of // MSG + SECRET_BOB_KEY + PUBLIC_BOB_KEY. We use only MSG+SECRET_BOB_KEY sk := readAndCheckLine(r) sk = sk[:params.MsgLen+int(params.B.SecretByteLen)] // ct ct := readAndCheckLine(r) // ss ss := readAndCheckLine(r) if !testKeygen(pk, sk, id) { t.Fatalf("KAT keygen form private failed at %s\n", count) } if !testDecapsulation(pk, sk, ct, ss, id) { t.Fatalf("KAT decapsulation failed at %s\n", count) } // aditionally test roundtrip with a keypair testKEMRoundTrip(t, pk, sk, id) } } // Interface to "testing" func TestPKEKeyGeneration(t *testing.T) { Do(testPKEKeyGeneration, t) } func TestPKERoundTrip(t *testing.T) { Do(testPKERoundTrip, t) } func TestNegativePKE(t *testing.T) { Do(testNegativePKE, t) } func TestKEMKeyGeneration(t *testing.T) { Do(testKEMKeyGeneration, t) } func TestNegativeKEM(t *testing.T) { Do(testNegativeKEM, t) } func TestSIKE_KAT(t *testing.T) { Do(testSIKE_KAT, t) } func TestNegativeKEMSameWrongResult(t *testing.T) { Do(testNegativeKEMSameWrongResult, t) }