-
Notifications
You must be signed in to change notification settings - Fork 2
/
infinity_test.go
108 lines (88 loc) · 159 KB
/
infinity_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package infinity
import (
"io/ioutil"
"math/big"
"reflect"
"testing"
)
func TestDecimalToBinary(t *testing.T) {
_, err := DecimalToBinary("bogus")
if err == nil {
t.Fatalf("expected error on bogus input")
}
actual, _ := DecimalToBinary("65")
expected := "1000001"
if actual != expected {
t.Fatalf("expected: %q, got: %q", expected, actual)
}
actual, _ = DecimalToBinary("255")
expected = "11111111"
if actual != expected {
t.Fatalf("expected: %q, got: %q", expected, actual)
}
actual, _ = DecimalToBinary("256")
expected = "100000000"
if actual != expected {
t.Fatalf("expected: %q, got: %q", expected, actual)
}
actual, _ = DecimalToBinary("65535")
expected = "1111111111111111"
if actual != expected {
t.Fatalf("expected: %q, got: %q", expected, actual)
}
actual, _ = DecimalToBinary("65536")
expected = "10000000000000000"
if actual != expected {
t.Fatalf("expected: %q, got: %q", expected, actual)
}
}
func TestSetBytes(t *testing.T) {
i := big.Int{}
i.SetBytes([]byte{255, 254})
actual := i.String()
expected := "65534"
if actual != expected {
t.Fatalf("expected: %s, got: %s", expected, actual)
}
}
func TestRoundTrip(t *testing.T) {
// test bytes -> int
//
expected := "4276803"
actual := BytesToIntString([]byte("ABC"))
if actual != expected {
t.Fatalf("expected: %s, got: %s", expected, actual)
}
// test int -> bytes
//
expected = "ABC"
actual = string(IntStringToBytes("4276803"))
if actual != expected {
t.Fatalf("expected: %s, got: %s", expected, actual)
}
}
// the image "Creation of Adam" By Michelangelo is Public Domain, see: https://commons.wikimedia.org/w/index.php?curid=15461165
func TestCreation(t *testing.T) {
f := "samples/creation_of_adam.jpg"
b, err := ioutil.ReadFile(f)
if err != nil {
t.Fatalf("error reading file %s: %s", f, err)
}
expected := "25519637684623283551604138549800901322256540519555396335820617899064263322699621951916874933477238769113255927570915275843998361103276005688090576922739485719480826535277429554392746393022730398949981265620478927434926435224600262064619504980743234655174227362545608569251825909819314291568940243800729262655548989815338549461589781931727220039897716104047790197334913754540527330093468425684220096967494299314347656521300556339087680641648928457451744971925632721768898994890956718121135849164717153741697751941520262613551844567654442817184286258159353469648228375105839794230961210520352181114940935170836417851064264235248693523749764095846740430165726660817614835805668819543432577739673489910830584869751313861455770901001217451505546942039275172797408707861212019894726034587675183533433173417315682689572419224904842374716131859697546876303088364930693729498654521583555856724306488675925978046133524199193473083671148963138043394764233868413884158553077421012350556748762390200918085080837062607084675858953717301973361959002972372688995078843073573705266752340450510837447960823667604529490584325719327392011404653034261368721159787734532831550089339807082545248016164147664191574237955887080534415663172822703315104166331742665770426672061560789508782381042448273113223569492425435572942805439248062255165879239457679062882371865397048868872322852508556720890361653650878884712903753611613815999893345169642215072059641129925760660773145202324923127976628427782663543949692619839620028092554747353406527087721445944092105055463416759019258419801545944941576135753679535522665993305224428287583197247362222235047212864502580245769780536274697210550947143627419658314300916439348168081164830210745437525706420353525835213591778756684127116765484761168660052783027041222605190528773288266591038846622560209097078298149988543489727922973244475209763135691960468507083025731549455056076729257685238146886696967478667106270126237788480823405852834132596444219062352171208446959274278340505832836253440445592629797728441347500261727865819356186588338164467754606914281973515069110841806413946197902832157030300894827181256169467396225010886599551292791295081262464491060211329271198252707122191887777345061060785733504858080349317886665238289378951673481599343033046743254720580226731989376426016593872966411058402534479344950582941565486914759377561329023869545760708489781835793428590577603690186594328594840714822833126377914448558186702785852867735297742776069406507869850156943245967271516936534651381273402460837612209920152745886684992641145009485626906372571517415048802243940293019578787845063601364313970241160363831883999298444589757785291817442706507187839190411627529438605125655709054208658779969871969224391975934384278921483609581941293726204705104573949561814305238792001434847004750517878936806635637357258283533921163566711615239311981193237093500147888426906645614543181768497978843960291395736279259270760394588474667991718522634158041093934081362999666278707274038118265408919780911492776341724860347062636187076525544783384788800360649281178336859950818178903655073531507356322684845323121756444250511565235444726602333189817041796043333005153969874159937661269978113954478656699716792914141652170662651898046125061845540593581706773157006728778508017409748703886108054218736536095394367123698799063396588131197619357568207877322713432180743969253524748294545996986249304079096336121714147115290487933750490431726138468181844799212672961002673248786695345279236646775197944905211194149668204822599795531375308185670588944588630166984510541577145705276474471902972447001999965288040482202999327171287118913101746581510944966248144501479033879460670888845551828146034386665609673491067494689289158756177446513477459421846638229581423473125962651577558766471285922162691575221053568273615898470914611873370626681214654382598683248876963213508790896949975849404195942351426271763428725882616083310571512297943964030966342778460008632659711473477488916322483026593912970583827348128143192241877903262024089937271704879816327963706356229367528815552931091591094404278191400454201697666754583956220252402771708390387838721996707095612222255158166806794902442557427913251948124741932336188437754805717836335712342018115273821246910690830747319765242479596660879380961743390098524110643471776498690435694713856965278646956186009952999575757369991610611061564638544924566642855138026883534396902732225112519044679474149113728591018041636070127764191763317985626878842050113219711579976419018383612189645378468112318301016466846094546477145383625107803842845112607184522122509088900337662447605002590999262600251430004067196335872859135971237072812460139569589711106775015441863520744609962366145415564499726213441236488738889320883025434495947336086483228058923734109050221430162970179863282146932879505875748448606102592131086845173195398127478761160695434108800598522515743106618555504492231741672442836969324714047035750528980933065467900200905216008400116701579325597944094371964753259251124765704720401190107107931518861372955272102230324773473198089802302570317633403535185887784809269038355220770280293974152396408589550088382240530468998620898052219950650568492496206241234529258487682942122371496015276671693888903603316398502859572112369136072857131426927315640650009213775005995402575660226494794000693951101331338852443608789678837206290267848017790890466989751839429706365805882469539603555039912261715743720149057799126002305159651519989157733419383610840245814975921642675768465566243067313117611460692454858460108390060463901392125706840870306297160212498744871219201721591964300111472229139512383525343220123836914244016039725336581248224215608452337356044566507437174733364133859511350546714514936222401615127557762164301909507889048126072564820305225177153180497573988591314116156397995002708543723719942441562817782728764612754962375651913333661307022579599480741520659507848758088084970665716561957010191109390426155433449708257380195096528607374588624091069100097359729420867825044151888135651333964456214628859827288335886380155325655429827571961529436574200056620307741123159125927139364259759452369939277300086332131720122317385712512030403642298142526480831927986422055561328553818532498185967352427674568198379596835320781964037283281920921528571256301216683250447855190490597825673300192741001814691883704567184356176968696730693168297934402266240323541576863653328983485724505744252227614886529205708122527362520470676790520125144447493600206686723404442345046707934270592946259510505320821642108358928735253125818615737119190422581621425486480219830254201650392615004365556728426893747701749643278601255484892390194033829875013804485368707873809839647069637929149425214738838260703634970088769095936290840679819925811217928510841966878749109092372913315688208329954598362610821022889241628769965576563813346211041355934867830001705593981451696239683944985793583403343372588394776451754711245383413999872785655871662246869041165637348661315823004105742586827321545023370887389531468453175462404734659988368953357831117521810997246174159421123735084070096277226059988308444911824808256836629330115955858016085888067884979085235213345024707250305672224365402796788163549293418730773984192026720719606832512212715261293636934231488086769486450680043296408137884729380090223305921018528429332887048420089200774082691039870033249844380683150379775093622643536207868845863426781496105112540139496315370715273620801603358201043783926941912199574448656583142165426908353864233754266713746877223915941535158011477777586664206589849758716702076254965105135236237643973365288422615399093477053173659920653936814383261364522234091899827824762841344123810201641294156107858662505263927147501080467514084080553271884665672223793804613869066831986135541867014693868346947908801850245667773305735112114910856953675080250588952926247604597089610838752559679060677011942225292814668506680538816075192892462821794619245889513634953903027265376350258191717802186563852288614448702850647631423041630606127859267012687196082562764081247089160873193954582142866025051606941088973497040405160927612482792706017418857673126390860210069082112123851756657731377933357281381923203414730389075493583249366476323821744399648458204266597990242434066689470672929335361476627850866073270759304983069401407401148488807990268487752973298494734519749985450057930011017887134060927989684998269230864337333042461907500700047949596656809657559405916050800778314249218278610715307818175729850012724277481533638685696355635737281572779758834773635584903558138367257236537883858429371031272191371562433259627048586707478304817147634769754613261635408735037055667256692154242825947755287138776686377014709668452951610126956703676115133615689444728127759344698540897047924871339971769338392529737397937175498075109760441588807619551372136580731486579975221074343517578224034762396405214740357535228149349491573723564477992343214366072534415151032353064638382997861451374561020556364097444391181422883940584553750435873974607426044680341268316754677022493232498563311611105778777385038290901299444270704648807608701187602349832638858767369029812132640290495721999513130908300227979200683541209526917446062651805573898358248332738032662398444107811495871826224293197331069266357711517994752320993291389640221754138553259599531571754321813246976285306735425467789044286353962431365943529170514879180188249162466415197254440597002511001273832482579556323649424534631392615142736524815367323717997686633276552436295694153844323017774490765437371999271328545681845496458691369119653371039530114735359586653292345893030029147635071308575786057918305641748675950481752146651751194170868737751699391249252639111582037678244374887406742523647745077253431642309513492890666277963333761696033391320797462156780264268082283828740479457394230434499561781860237928870149790342942358811446006973300740334883900852134349440153484503941239090250265244148691765009727136115310612931004896635047672599798852987096438484236380473176500381589307351623572852827511540918641541828959798395238907213741233110634408119045971621013866825850904849820988854764596525508252829476945036889109943183952088014391637417010324963719168623051414738835196929376251936892952633530078044610487618106283324631472252094306902822383694424264229328611885042240535589987149502579919451501816178146573015378852075509548954973989943273666130278041405696786586232122976132840818752611498137537392769584624583912617536370538747130168585625177121560346941810282117573392666271630613255813237007741080152373700288856711046928158788768883754285182470010960193877060660455463132556279526117185707546515997219301977587905288127023342274405765405212876339084875956888645155545392510789395906019073356338665658060928591105010809173608524105019240111173266893552275388855160828207021237550660107517897579227481301301478591446042810756416001431328761067269550613680354078208595820084937579470427188352529099488412365827677876428684533925788014111164675053899803632693796805247023938457387807710353168158681946840500040244893428318860300584592657507871134605288658450289027056360908163895849786027175697128267297762774694927214334300212161854285744501034022397660330037714070431777558371586700373639505080975205231596929103402246896025797931182948904013406014648998600608696191737848281575397475405694783410063742151332447178743692554562683021821995538736780834340791976404910724984183971660572444716162598232573490878437786436120585610881280069116677484620035190204149535033863258858276667378280112747048852747379607331972293704020953568871569138212605763480134009038537852281043641600159701083142655147087936256185590902347905624138524336724763028892461920941871178404040308190455226746552026535609551249765776490548321117820734606232027031842112870309040332312558386896595188103545697783431274596567698845912395620968113120481971111086925625740479271571199035861735329829456205593151637717441497326675002365612215112507085605135044762664777507626138157882657575350472897678773877634144981080980576252148546399528451908161806758837837174898653226927745931049609367208267477050517065207720034141896925409525806807432474657767478690793957826289636201203646717769328982921522201665923669938956663695732897951126358215775429971835730120508078573354581976649458525361729762090839973842671528057163429435330791345898967646050569258491764053992261658043661908853487521871123258809789647851530805524378646265139127705348384362219462248132105785020159383675118408494395318584174398210536036223555758869167238938742051354771787789952780583320731372349447316492859515135209036958779825378196486352939195174435829208485338306210521764525566414119428023080151400620460999654005113271496592647229600359824976921872105025750336563378336225639810859937874419370814598695194803570986913063612646262315609390415930237489495963946889244516944559751353960188685963313326137320916675257091614409296364181659590021258365492840935822441908816520289971312808224614090364995550643248401487008390496853760105164722988484084357364009372609237854772901012911394986428813520341469485430862558416535576475098559762829482793206390442979082211928953988908222335099219670444704236833909971151872369152567874222552482437191990952929443756190300997972774988180357522859168594410792841442053270409580789141946942375720415876652885475764383330343547126918874987567822307786830580116320568742985741762886316130472460997869691220858942218535076745779236614091238809673187198131548010023080391102804479471222338059087696461628676332006669768607378583142506035688094988324239814125219141789700997794455560932815421675242940779415576441614725426840286573028217636163739115601321428560897869037780795278480012290196778193781169763510439845822933396517626550251712772734724991410964189919638903724701055230450261967518021174807617691696833819535104601969525415701378958948319593983186759405777647805121302532227647691405640175892332443419721403586371386378092716061724446448700218280624278339106948444353428520178168958364886412707201591999359997186379032927434606099034276670837595796266247174757301265007093773589698865764968544394109799308755864069069882111254307831315985115209460809237763201084038911892223570276488918658445942925516016535612793500334305491466067563685175106527550636797751686671919232725464811581967198171650953577694734244026183133355370464881882235456746300915608303163434002126596618611775843124270254340744037141363040664298175639562461789465501711386214215121216414529913886636471770650634350804543015888009094231231403686885330843367251185173976262294836613180559181696591225070275340506615473857791802895626459665258115543515046178700348475147351400619182164293467234359290694886575724592822210523787684019565057383155326920281101175106845143634671854572435776109830682317366383625121655930092707573838997300184543346658199218458135070113290255599565536105115069020961324811584092169542525991105157781694811421516861316532292733391375615453189141893756630170010831338230690779137045562202417174937286490571846987959867698004105230698868733769420290462994712010492647165207169785786167660068674914161896971682939682623438944869027010571951567602146380543028261262077281416102114720336743873081912665173061412393146033275599967517768650133353319261501799511761189442026153767207749284918368088988065577220153977693694388602609971090990908045545457356224555757471598532956919193354132117956570875570141432232374547281755697162611563105746886279597937329554217588044901772259236407198154400641554639802857803297514398085190386899475886631519220827549701250463387907654525754558226945233677442787851048903731934744326851255802618066112392841863433674793696391329635403484687355932361494498921972464567519016047566994023290044602515554559424331529835457328033147682426702799609992628819380063320344259990535736930987591009919980635709193685431596717252920103184143316707981242534539857635851541001971028610478790436491040232859045049245462863630130576549792971759982870028457005455092533708658666664856963575786714317723956248070840891566245910727430070992285895629530190276744849995306092161224612417317248356552171345426058229375408114870980119311289799188985665120095939190428986838125744515689599060598018954343277493221617736041119764133055845149630682296561780658558221025403330807990846027819137795260206713730922800568178329376674699926124033701425590178544990118997125655679479420173649910912730203010089927628849197305434851528491979127371865236742238674106399810283068538364378346000989275626077428722980897740489563586578065358283023290864664621937965580424538128023848095089230897063276959694911760562089742787351595036917286479090022469660959280816823811553697335444249813453495767818278220738915629622849760257853743184829043765681866864577306992393228675338403395439016558568675404808541206243693813520154584293769209420693461449657269155732822750715514463553056990732373232213649144676864567833588830752635129799568585988077141367329803376488521415421221737758771985721282593412381085966397362265444436819553948937440269591142843169899738567866034775100808357753156693285484185332442669273142409508520109825917970723747186125685553493202360027200762238835112645953252501174190568677573884044192401408267258290204201793111630429331545625086141549621042703358483913511105906981597248221350885748397025543179566804783222235354481805870155738259747919105913251383408823632904566111848850833112166525723463529385511703643184084787916663494055577184440710862016571972562717062571487123885770813151476744549793819393045472998713189614149084278360862171673387008058298622049761062662558263578315013793312697538223735657825128278643996380918449667001630815283105102769347787551275733715991418002475631844526346087653716433666359218107869642683203807134507705824510678084596950332865219938900095889068947600857843450352249828524349908772871279411140430950390935465818600973617232699848500783172986551456669778469820238098777944181131526300507009907110725130131345913288035959932228989902577235620385597808161964568360935927679211473710586696476950281176606074569472123597167805883874291855539973637303746515816923812026274683352274423452398105992558228069278231329727724861963596785922344231861754874278835475603914729487407392385128485149561774022340657965348752079956967428998558851497476394795312362415123160253840539394988784612905170909134781679012705279877447249367906096794697494085135628288764854230252338318298695156499845087824059967502691004048533890717597433297993691226616627751315932057739109124159405010937136092914245549325012442648177474799748349490172403810327167398436948000401809263985568538129453630463790990265642055028060013386747306877583339467766779296798828559660697804129526193859067942197331344927943370625756020159369408344272295943153017208463821297598102607469608055576850282492352933940489965490171565543735223052044398813396560133871803204837012396774088689823926179747265304003997822119809240336569743974631069743804181399793312277674822708279270076773225279257078576355582463873818882106272372946400967615626042889296339918080653550299330620340451211575116985177491796445718019252146245961535501999634255470327091324065705727697315708138345038976811532339881317832062746860652414375889841192656446746960477539651933371588378093553281532684653425566059947440457669085412710077433432558207664439944330164029640564884556165002768137836312770517346707574569881139706654821310468789427287829626550168335778296485055968988997954563365626866471765307561507204387752780220359257199685778705873014496243165843051296966155205515414241918250539996054722481697909688118561665006554842408324620440485300308024787535454552525536817614650085886570622443127551037459041627770941149203558712015318440057988210963064181455289186953723495472072824739192526076655728148342526449886838113274512842683883296902003158854338106999050255633269140989774602970785700557264215319853166941916477018865183905566586646556660960054788129007469494885302595388404289476246706349562673341175205396720544629331759926027078042419956165369940282686446270275242253162606219616207176076795959520089168555389983161639679741039045343053604200562819631204004292973136615641770881415720197361219385771848850656037358647047660264654162763560939984216802714200267126075484354968976493476170483011184887763706831431970137542199576504430174725664444941455927287045332163963391157424737447471396810845841380264572200248791210882636064972124049245987673304094650605921748336840987516312547376702473427277123349579615689313213596489079667060475713177361812401127754758489034240144319066332373872446926845524710995349245690323451076473122284875410974584868256210542458738872620035535300391866243284251251953214316828810312089850908760688157215177603055453240911072127647197447438490037484356862073066654760011200359371503526490675694495584857799790830789701948663660051698170648921344179602490555629220455925852522203689340499414327709870817387494525778128637322120927331597611631820588517911357480265627456870375235758427701978605597672656683487293572436117707912005124888597203326530592238223997556517815108570270537519886143393390880755637341647158065770750807967861993697660899906883301214222359721333449752338753643237764624076585073580934510816922008479027105882882731554025712600923882691458110541778846764630266003975461046399974091455538485123345045929078205158877835448700241474532290916251474565199080519878158269438803257559756039226312376563704329736119420600362572072963861829299335238310189278000052796780463427736918156575317812670140099701739236891134130390312855835569557485275415300401876202302910236016279641370817657929130122545422131081249021986356833394869063240180064715724029684760571441500520986647016685532686151099159916319499458112007588621704557131664112255821682830063012533929132289848338536546542769217115210915554212883421560787563130604822972931627369708649027161726052133330714843685178745854752217922443346613162035679510913319356382341613190527380624354401118818276437689086418086209814730078352246828402425426674050598020639956772304346013398159539817793485403685088700230903038649894432920206861613113060716228831272603398398384514916121036067093703956909690431834398542716943537445416307834887933912143790787095054751956335645927900225527476629184584267746244947964659244411674062925615385838491095449246463903650039565072092834807127621954666704209279417453654594717616087352513087917610327811786922736398597116329999941953015800109765283053842553652259341041140768875017787380381229613154125107918496166206685602702229726953850955315241788174614948478830680153392141689394456592906554840264117504961948511727637473827659922009009037947509279821874441277872942174432517494095527420376210311914732644585780994599589623709616847283108598017827461473711915245314921772393254867763664679410621465862107968876489443163727409240874025294178705865859653445858626182293186750274756890218875219183059944637465034643495186092811819545832188636760550785957512157738368382421091171915923345179269870260936582078267005757824611130155798783386268415555238510320944101118245981495968824625721167205093581763871564205966189835919678178624890795984591316521287766207834324245208567542128817876726496245403687063709298710626979647354940793163361398229131067056684481528971197794719557185736222969304111033820262875572903052620257321246153956732893494488348976534530343615225244297068398662815429167494304356117175065420147366954592497711121802372193957224845401638281730606617974185928351032321468848912833724854149475563187481256001037576736498787950152310117889871367847650453007661048139990655091417776151823098564291450514887606854331222383081476328298529215800326841576636769656453335575522497922909039740740142600878217728576221787492398490764549568285085860456746896601979369835751479252168177566319805286315415857974352832649825408277255024062406622048193954785656032946713230016116241094724180168204493724786775342630764315816350829920670562427280377825972095584089966356055344239044558435080192613758700932626977479567730685992921055728622493813496295805831142295663810955185846999084177982333124448398792410921865640909841610425325344804740316400716974270956020751807662649141328156764167044914716998682500272849247249377464149088196288841205507949096681785481756314839764667922193299863718693491313433993918829073157096772447607978960702348996535680753637827597196283361086210008021916810740621538031303228643067103024557940461122489799485954657213115070508354566031389312191771158345192700006599409699059028722586663517191204531863142351749733262270578293440459149230876369823731372784391360929785285948957076949826684870494411789975182858522072273022079224070811872884280561392499824513217898351832701677000688052620425916786088098385764887976284223454341038544991534997212818919565183287604765127401584036731952100748364891128204750420396642995030070467853325233733296650787363701266989036660759605012486517288272080381567004677357958323596073938127283075415493907276162710835876289871755520161876690859368965654480862956119120223181280648522476651457949556959400706614799929579245512397282794163923839479210688259958258723474901199442107315816479032302293495658248482153725596464162821839385277525051823828404783071385224587653737852890481553343266651550003279512079536958872090066097679965032772405885004465775076528684801008784492046744775059287979904877649869306408308463971842542769070130714794938502253424512194890960359910761161574471601640338538443158734154588217090364045907364190455680798343990956318237834237291188214022641934320461665657175226145459959748428153834844330967913653018796811829231111869563867470522619264492971825595634572335661319793970363179760097154258133500330143646318702356350364294462129586975987137163985358953131418937437529228481805037525762098673518060042650882750427821385082610146548745170102221208809626386250352592386055177824422818739652002604012267512786688000705499993406708109510336619079070505606888284411653811247489190423313927018799969780586538932635518010786412091571006643251395767156452459951461015554964005832290059365432220767953168705445284900964348467674769835835515309682348926771633765013431729315872961328131669360659753912533428717736908257376983023176813052329115604322785987057774941234017256050831385965945446450462604899383903578040509441759091280600699487091080262104407583477928734851293968672280972337258144722435217984392340960343723197067570345356454028181693078699727668469755146914193182102669338617563397179238029740372197958641914461482795710456080585323615828679285449410667956741746308772915218232824288547342906998523123325491104931621763609473817557204610033763052957060713574282587696967516239309659916314360417926601113436926404623294998816647646268819088530796118598888867260638912694750846483214824981118016567205691556781477507069327858079685706918994766412983424244715169169613751235176939620592783110725776167515775241445244504299245679595270902194172677178195296275102025154926620259798907823102105503700689771913633725292127292244332624417089244756776798474407645278802029112515642716273139407823776627499119770468998987122665432115525630441613328996580336369606817171191907968543807493591205705765327628762440596744044071896780954156611878347924055981763118747918941511460548746883031466894928897397261945549529359493085825327094239805678392230753301124850358921782941004011563816765867172465374444429479562357868026149422503375818078882075207667860561861603995385104641961918278195066724907848712253166814808662883883100283184695304301932572502464149682480199622699898774221118573652702283785294611662487647219340218184592451403841646301219973295039572791355430786005696535833066714358091600332506731109916783324959850806739194560873054664234214164599070052975238845183038694263342325415541066491667311032104944671332334296472868419800182559567978313606890356615701122554950161457138008614858691774560640695843227008765757145239302327325614638893423487754930202643649158538227414688437896470386366238268892656443653868794673734191347549516042016562455266135792303257813772225399149266341088105230090615743913236500542869210254376065275983920601449901451705559826222363005099096645635986655730748036293848487084158845919298084359077858772771766433972529148014221861934002654660928781848165715063730903403428412527892385896671295461025065606542619862282578522004037783124076104214137975017163000182468948059042074702955221265904375952163860207644705888601328517389807831492173040854779366309182796905173889330907512677118071082936997219272594261522766261453465789821974824936410512224877978303413217978287956854986297078269108239571859850085600386282435637682748026443683890979038028532974160149078179903940705554803730596947232858320841647641912392233180908588396958545871788683093815673760956694585832889725428174651885114715170512676427315886109681131610139073213373559319878766742561252000763452603197094890177468972794949673160897752182306637653810451935954342952068946281508223692123317340361948844687151619708449239394297998818252751749920087890182922974656590199048687445170582273963308581042216150100098825018010850237449360733830600588988600369274539786503276431742915678399643007281560465380543034449162811288434196730771531601095390076679957783871568819945096894890266113801215471484706748905895583815705697615411661329211445166316356720201287769807780737111398871819783701457139510077520626405915005307329923435419048761988151039808400792923328023514628906141272190736740004366189210397713054409229845201471752766311753720869849580482697975039997751669566741384767047664455753493073904003857037197863342290296830422130678657332287326553897798874074246031186367302850974493276547919522484901417788328657679279897735033005299362612560171152838659447097523685286768142410442125674951324203601939513470780283770981708424142446462498572406542308102001298656887851468624527242704825561701433110836024484019889646894872283705717693444922235227275656046217423868658695364639235917800128311470897277105549533564460812361422102714866961696405709829369046780496375944389564352004558975964146705382143430654499707128675846110179122990015704825980061701665224455747990631286401989393314437172579231267271598771280068299989048091597089637466414331461755818063244827446617117216508924806936659720305219304677783290138258870479505143636059231769608816989219410969739096638237063758759550700419144948867170542553965055978657020311777319954286126951729024768702251469208147804562041877266531658701971640616820188900822780345718906882560483928551656617525589075420655210124146153523580193158932308420425402505028433545967163557258774942797304378235521909861664841083725315053548369793148123370628526085242614803926933162291232783284047913471059712152007030010365044137486644249855696115605087548214285269488125097685139709096123614846654788330590999120413422898837150615007839884878098779327467764180433691785581371889775348254525926065815006373721976894911532624772444221467098363278578518374332215971017631554401700137751469138821122155952847437586902988294040358365607997914865726415751183132145283369655616883870790576792917462014765208471393899825018306226095464251142848530808826804827710272333264138295314349263994071930326554824894751461102994742542660024998521800602597466586563650207962940283418925660011345944670445967365563628998779925923987323794013979459347514985935624340175225446986564657805101708738429075649603680176112452603004304788516344359107895869956581233338951872859586534324702797585816944737410063721988301933780448793834863459642224361281781517848584591896121373748400299542562578043161884604514372520276377537162010397633210823152767804749075138226891956848428562394416361587866180097574368872233602308010031752237888922992091673548231865795250909427987583211614431932171745398530373832728706605547048753842062509389027715568704741710789827511903556237307470017298805103382091143640331547996518919165879183929320842172247618083976879178424914610401855830217590715412116689089937605164658383716138055097484410433742156598630780216088262883372415740307941695229419391698942797631679561460136414390141959442934069784843267894852063724126089372166926796700112433562279854156338092081857894659915333585416059317881528514039679000798739219258233487211108712556517746647330813763741651094384339433383583435150373539553053366337044240834365116926111518985148119585973573234331305312873272157925035516118695593984283531791810881922094527864943259229413235693433540832525195415424697815620538523315260952375229995099827854582128319490622248424882997025428601240976700055469805391311632606745665388115022460465540808959280383241218993608145548074763813806265647579721834855508955670600600837382822854049973311686929208525998676966121551735942322223752456203170969929814065303949121564103373542585797992204295896376731473557661670349836149498412918035643698792055916352541962977780642198871345794887396138068597374652886879379599763997669124876478522797240606188908615317778189013346404319884082485099896598790278685440094167149087641757324355604972342119656972732901903140964516069697036364561350968258797018208833949622796166743369685252978228725431288416018661486109675222180021112223343049649389137427005263870564999703910510299166486537354687050798024931184427777018490197050209383450535001478950337439261225897199323750047607184134419757128113378052337670777255883155451972343471044854234671693338468069828448126303782265636229867035200668597521738348964854687457246765045758676721203254587966208048793893262652676497020774936859213022045704558148811735927620750374104884838197633921340150446197416791988511129846212464441905458096870496469966162134581904866684935370189504662710621493959220020152181224868563893282050060295528070648542879317945200587744992194797350837994787268454933516540414140205702275333365322707335185890768471404108337007865428793670321875146037702393444460091021648814197264386519693242551732433290468045435812434132859903064513011898565713710839656032327218148236801149306870587755218850811050258471809450308994927570149019616214303590391106956165343554849116201660727001881539273803038912493022703285144062985881928273364208060506908721213456428936125612697743395913595373148475682986528874547577347053043922072844800953948794689408713850410076609697216061286515303067321639408650928789826559658752091863600244786514290606755966244398525398871804421978437272376887729696538263688225978692361806501098994461923149466776159821108114516034390414673806136411782798612278087956486810765302935329202893633280314316331633899579966820055641650253844201523157689565162839959332133506297279839147199210882482852737667857090572894808361545188848422306379498862891154351697336528690208177333406732967004502393738382461778503218725091172734841100323225288007750635663007951958477552973320705053014890474755938290346486176544445675527706290940262697588225133487931864752472359822504043043337271918509054246908473547818274734058208539818380233930305128573091810342951799179945482828547555699542257835924157946991180969250337602894707050294785227867539808342523346031706720319442516716357760449017384697107329910570855376183605556918261497115493207418978068565328376411394369889293741941396308065674118237582643618125198692309327620534575548813900765441702926136274286537311228966022429670869948334985868451717720513601197636413214816405670485404475815067935568507097451870280366432894182940924510090266870675265795058676757352467323979508411117197298332360560990554397821432135798537123565103912288972752833153779512417449728540312590970860811711426076570964284217497026581700028532916048344740309645239903548110942669986883395075405843453895384233522864261597385026783442546293338474935647696290026075907573124225411919938215692576891827452120040108993578566537784259432503648225660087064271308263883334043780690235999274690286439643365079927284402491181855554326144406824919211105676745141522128805294911739138730996851455561841377995360064259556930561917342901716305257893191165937860494373870499912747838199367543100727192743365091037841962784386116572278440681243580191161264778457229626473039717018236218356999398336670819481635806147639133688632449848501960175051103030939833670333564727312475729372507884219838525585704501065702868081633775627625538691180621447542371162408756864560123283975322824039721470144543773807478010308840735023644038285159303183830758355061188886451639518751744464892816960713717182496884790930851581733404481108875357988398953241916862789152316319295165514255200281390803313704130822638177771566483886857991419218685733614696574872602405951463370626054451743579560525851200101918805798708010032019698353618332749698166570120193905307812133604894211497726921316206769902248674193547612534547844614129306925337492585300824341705840069109228684410468547135356324083742040117313362036463427727904761054316331474212023040607474563654830151850463623615663098998156085894753667674131211976813188241307504316336079396751616320263176069445262512605508399001723291637714041032288421472615211430170243885399116204600669345435016424352145508108110815072662881807473971086033959707897726697393701642454201909730716762230406722713647152207238267713474090636738986132703966538147343976830248053074958916184700488470370128627724436655181624763520949317916290303417219170560775438386732001757722992000566355383125650302620971678486431654063027878001476845451094264168673661714065154002627040483853275918373350864643630308827389374530863431722665332420465914737897218677343844379092730604456737523427890206753088063892300302182506649055005187997958521035626052916836796365772005201956598986745939701378359322356186602353240630086752023950301928074112413103667140363460210909895192514979806337707794071749683369932428983096331574884500214491533377379702356859445105627070699917341068552020446419663059943986928847830306435943958465618307620914382805388863134848330352625200812146862696154961984267935340705588337989710581525182158531637136163871265729883889611677370631565173120618655554554273977420706492109793952725861931399248848641685692512882224834654628874118527334183811144131034300539534574978875050306821127041954031078920012864409286235727550734390972798557150127729220098340602824367187383297763287672333724708988848693858805125805749748805878986040189709127640407268712097328964022275934922408593808931770545130425781951862659400093303235167435938110868040088098501538922175093245163995377511236199725081458776888642665833575656018297341547508938474063557440756197216384451503425806482692560013013338935056464166661977268070391635850264424382840519450526797401926968527147962800161724250866769809102534283828657365265624259812900267588701815866473684101087940027375855742636946137377424391038841211011557054521735885608822029833113982391517559978828219793226162056916207311443047174575064283953264921653016562817778253415830879468900267974600133988341490459374063728831367173757074009790404081268040574968967624489697179985357236955118739742080776210146039559705379687862401347593367742756804399326008163148008677569340028180144192690795326875361187147491295119650356076285058686222036648811862709823247669926453682025273162228311016466811239315472262362311596567490653204211382051493995451234095520808798971662425667947654453520799491575042190857059696147501156526382640489816634984299243359381392049649386478787223977121219789912112543356367939148245957890326892414741736116249564485670546068796771901472613980874082481612977067770660804831523991911863722048148929943694155742983482779925959757530819153009264773694585923248377213356430042375139471363503347568704627263758702274210891607426766953166967213725854724358212404163697106208465892927827096503208816145644476531872335892546710611236070334765569655563431517164675295233993437606697598691773692949083775377353946028714084164114859506262285893007178864012584266566003285759696153611970549093019129013548136211252766669432170489727644694175011875483789264869124583691637878248339137752121270350882299314453658068528370982616702897018587579678177818152818345164289738954525527326834542134126790622469158036516225626253303768153636207545119720389601228106481971152941436442471647588469755122190396920018656911888066266507965908579508616641142215455601691781640908451485039984304830877889086230485236896248820148255325129704929681112952193807947308397164562462374780072502447499111394418071025680003806079346190582387120806680503644497671834455635307687445441661666648790013454649615333161461740756267988077819482230400924053061489960661312112436884999543245518519847058386052814483637695161479920328405800664794256009530214834999269465384156293761328002231598146578814753165970228733981482796144492165774900185138638207845793012000069627088347196175646333544187217530933227939957809746592001550357834354719941497988664098487076374488302276413905559111996981316371945777528875430907967795186646961125167468672049660000261155744304209158043488309246825300670960916214832557949436695261264353363899354266173904905086900422694352080321598478143589329244287618359897093495195284711943075474481035075817540059322892826435545691676713846045615713737809851823829769278697730644801472728638474539658490554814977958053292121971053227348449883769815333545519457665188502905423908947849311820658502495964969167589606962327914882770711038626266903599027315086500357794048240748187451686353853651095754765813232177714208493908649401637115278070679036137594001558680137544396138916380122791337243116623175945049662037037398577553179833496207319315515866669808745360670183721377370745570020634278541061701052547375358787721110994690193250955666336099336774536535043127957936650596077156671202678557650385762114285632444371726475516837197252779350048506703294679954066989140848758357829751616368778842930509578879228425840357455848047676423826572509982079524055518440450550161722591899836367581404109205824582209821072586902157762066994079800880011107217336679410042064473525508816928638070345986421400670474486094448798709122341876110798770376071786065532812674078500774609365998626187031491986578277537644895742918816693479290749991427946483967004907557362083410202463058921679595825688185213301075864534203494703939477481338505337583882453233466855879750260775705216138312456300318925319225824754537673619226342444978518158182498151778316816558888703326065407022343540125606343948884173739957094739606565417935912525473567091925028345232372647386428897260886731076028498366702455416465315127288894249974342254950010560735507240683229291106070027102303591193524929625405069557928297835324367099542648536478782651102680676464984635088859319193420332891442612954531711288232451850982703004246225525540365629360257297569546224135467486703257262255148935704606836939514889692956743270208337481427453873649510448333501861951929800915407366299639427229679515294797273032602235096931614405976216020448718605490532152353005444084035927891652299677731109004685604418241647368255920048813882640355415932780776851457204933698725706964124607444115370141472068944966766204333136988051009668343975823620715403204312129374236089156972542145692893631197044358026316387061671906100394154279097866063165631581230695363907476131367065252864145726551445778652198131378455887475840773480040610555331070410735821648359648021720054175081741260577016025535776275386313887323009977678590286444528002740878925613228737195382003554415461762448133065363054845072386921792156186650104908648338191391833252596405094404139117816357015052377134122185528425729972408153618154082374653327597706986040176984798321695915029707449075012839313403343890031956008926868136446400414939923835044970704523053478077579828284398652815718284743663227713035430056840904414316858491372762591174470116606903985754159219703591879402213757276214786975663213243877793544004339383672226781218459989225823745410284374234724159506571186451943741149592490581911927506510719409211575249150124747637314208399688591007257734048836277425167005164326179181700376830473135236973647681741646470166046808700429048941475968361108575083468422230447298931168636101768027327583781224496264600977630953899973124341477050205239051402633380532691880438748947654670580995012548664185160459117811686147967589518125101541737700265394883094260933515007379454659204809927600298403666527033816739621307655240229698106538608533624895874852916698705417872843514679251965775993000794237212279330448907090422831986009864316914056711069663802706184422078840981289922757327880213354983103746014939752511711719017972238669694573542681939486271810914367594948702790531171784545782781473592906480056674645219687593116265135941382200010465973078181053090224971870954568460284978867295857463440300340082354530801066916555052606645104730188180219823607328334072195965279155032349174395631763063500974832255617243896962694839349590233101592503648251685665264725834079240777537297027316644718045309287644665823547180120758780366077690397515235238735675690741178440806176877954792566961005930980264501503049733258159869478040980097173533439629726968474724003061925600737020692495348569466014609771783685441743545273977651349040175868708771410428629621989966810705904067157298623545905820305217636168749600141974976485026707798636244366695696931836982855013611464378105862200068363030026633484413296836246312081468552906941911626346696364308071527118890600802396252303720375973229656614949935823018761703075087575206310160004549616806020184500866367028685336795914710509203971729411868852966581224300309980461948902165818228789801984844835171396485796327957730234427588686394254997329831030304239794588120601028609573196726270446964642417796026863379899082978196680179287403427134748628284319864359904120709066337518229293502822890194597109855323796735794607820640934738676823837268678819057802055287287038377360776511292475907233785567741682844660176123624861946745548057715694618862848441440419833479197329791030589355532939301844465644724260017293744066294572963819027316999168822912121040230015513651411830751851152517341345154073523243349527394592166864149134815341283083169242918920801003192395828332176795077624246554589210941401154184381325710807032821764130267830505512942942941970676925230783673458904787955007108048312401567831351573194713624775260173435835299356084188773937315038740647687810196570586805613612102871837079918302838073588346597485436160899787683707069529429488552711414562829401169911287727414237679100145631524383407840589542188565718620377468440974666733317767636595343994275922952760221730644360414049066949730745732334520073285258104934998239066672811660013711492385385797355749535688531242013783144520545696484582457362787668863296024709387593562277607834915828682507263055039690080251036214971925233489310578283328284250670276508462323177399342434020676637088982139045877510484623785007016546604293977720233301134249843747552320328748063925687408641046314109558232759831937402483070553996896293175086322682503791413024476534550297486955161846976909322115064055151887723859290997897170847120809564924121636694487446364359527972070068998009003673090114774123460093133075319782884166200793599516573849266248884135095581059848135706613150656258940306252629347694123849661207354138949377532813850028457409856488037556469751614109185867754027386907299433862084247787534620822525677548020226277015715830202908499440554641788301102935667207571745632419914013154928996216236993320116326608904664480303971634657861600542951877312371481349226003112573865347117892239253039150775115768465245211662496269134633212723826494750533028375990350180711042190958779181933423754794679000201738873086483735122357469312854111741796035085517205750373098531664498433199769869745892845155211354851712178761162818020369724005533778638890576737710944912370700977112579115916205878330076022205924640063313703293568202077102466448443051077234565770217610249782127446281469583207809735559082269091963622960576672155774127963698918120412108795959456085504090880423890847857223063463131625240325941179787371822943884148160057548025468664079224935815863946749803569928577520105161581017442718392739030373581283435600214347011208482346602117134195184506939233925422248637341936685613551294267757933026280096146689830825515375709383567135751568826023817279196720220041589090339358722120619516541261868855020925012581845366009137998665343062018035993944518311897811951850218970326530014711609012407129994537520117580847849864599643571122924849355132048615138741590173703936890757521232013179475771772996163989587065716159911235391203928548387848313188393506245136361275030011693459897366276511370540199822102567355435802331265932427563604702486716697315013226962345580961080513279618737028302718745542629061123546921970139918138551962385934673277081823347383109834802296065757086116737391894920318918613427739391631658818697135494257680114028027910471340046554594663261331937139252048490082623981808592464459730238830927254761295472093461591705987801477593291338087241179865554306852904722242288577606413996737470045981845005655131079002741401693936387074523959855493315732053800708347186405036314215719561178451502967532144074986606687408923378489497842200159321661491119985295919185867833264998815789978937277509240529844628196808350236175612616481530048525039286406366247094196627427615695472709395073525003462014526829333992345253688330481328692777891316663169478435687825862725012542344974395382009278178705263169978460465128040213306691100957105746056004379040694254012017412007075887027551088120778656998891279573909785505721952680215401944687740342487016434849157271307864039240162046112870990712957169086577813463829176370337748806510899630065116946006500107182135328147737746827838166247594826144304759339689787359394519197394589765206028623503688138063817872893029581283001308497365305920232093515271350185381159055483960414251536718282501969275892749251310423555982394711369817381151121720593185368058054237410658635397489400257715530841340087447729158839688597995933031524985427855353539676765893100334537510676109928898805391791697501785857843722467490969884824737473720307390245250981503375857994176154293629825374613480483782482421101827477710508162174152898483259174819135729703687735479713605689082251255908836408357339843392522512947310293928161221506688110211663105262028134717047092935113710169549295311504229352379263811446103466496253045860032712668889033094615182106910651944918460826943885101186185247657734273806378007518541776016499963133518629515603741654801479396418539693779490371018850301692339466029222350197079796983095889827781514264790569154073086351646643531420164077201333740000117269403960552146238055801003394192221858482260267835890804246606370351756921781519734041095287865414147080345824548367249038675993865788514125574876052980802090965567628217228523185142606622628064906559524724963315417704842478629881098963660856774111703492105694618199708584174440998337747248191261876860399817690855440754621326616609088777727952363254234349510461350067270752929717781933324581140024630875635297889135922748531301332035530272917472147111630677435883506101350560530403379903659696266496066343739487276095427200149611818621293365052270760851996577378981615584387744248402248077489037530217341994012852629558343128728908886760928782668421775777734392965219071623210239085503879761954865106232690074159753596890743820414043873268596626103953520096792886759200359334085293717716628641746963208945581911790936986571743142741131845116568489882421949809050108061678246263981710150122535688391242987138001224128165203762729917507271458522045412705912739816557753438825959137689863557239465295498375918684772778700120670877546741673201926263658932261385456114275560792174527938706192967491035610933030879466876834001470408317221480010338563279163238335082677278810480237286241369110390207059886503062698159743677230520232714868268064958195709446176634982431541259926058988606894712806864577966885616596855925241228420368078815289450334955626675307272051985943289327982157089035712306373596092906384811327505199861988954709558093599094177392720510433665647009184937683595512154190488288537512043257355434727629999292091036629407599485037100727003802865072067785876611185272008073143616939131215530980723389673714928564758107957781982109412865808912759948573736649878243959624036707185096190923308964488937127597896031542061408669302542954413925771996917759686848685925176093707335989778403700033605889108630683874900940587216400832692726182496859926350118269229056680321172475966659459700642506964989848380725250268544311114399987319522451014807814683224965367702220272591894997904098813668370128610475693396486866106237112396621497733318366235998832327465438556331297534462891905320930547527116847028211663522639678182783965955144846215204060222072580809576739604734864886086280381797794445872214455777845301151087363158291067557666239018087550744580659179348044451797312322585702913450659152084592971033697050711230300144077620462807554513598982410258544488053918325729107157152045678968080494171569666360796885746405815061710139949103841715474745051060620927137699918258169583295405670140713837286621876760503335865638821935590556467061758110146379339885538377291500715314095324308382260187075602914996470107698826623950486472803641664959452106047365105774168366402192622402563039903678654075631374099602635507020639628696126883501372915537289643090238178189868009981653509003359075515189795333694493222337617139578930187688439895142049401726320943272521399884334566191283857849781230381935013812362839927145578409327894228294504043753556901162232800502146408114797994623860198026829679531350367382337419368331841434369149857472919122297992647816906286878959040858030971510057313750613188159685831125851858437747635703568677445659200322808535269535635163507996008157217841062570592109690027738827521926371222503663247537886513538648495726826380984598533845451850517496567909315153144127214257420670380461660894630373996213627022013524196527648300488370163079395208054665182582257440990324314122768471863835388576659394800333891740909005951049618105942610987100555399462212227064185550115042630390884836466850864196272912259913749222140879395806459917036644237121575937489242999500567037646241681376099780339963205842915930340013360798624551335918114577310409014607001397928712574073147994954678704607948425659776056001647761768624993276863264204758187178453197331102202539571801691843706369441068587157490536011652743872396393031366048090109428844686737049388178108800376656087272318460420307566434873230885716389487273723783013592613888470864896325882501745884668670415108913286170725660963597847162598117509186490615694551912923117191731059389078710079317876972424348495604559897810486403128773878605920769543070924795276817012720342161625913134353349157877133557580307681483526748409726508288078176452387605869671822626706196907588473234951027448772916018580091563071150297522357918756381245203200600557217116631275563323407041729826220796163273287623292867826506116261710233124007069439384876063642621618172059744800284065329337987872814289977118189084766525637955957253933448965793900267060947588458366391250431261013562467832549000343508514139625098941863625009593155593415836219387783123767871340003904719827372042078130859256265769774654052795137861693834927219584198216330335691775405491919260755041302204490934458743178027998902230128416361113591984789921646613428277463134367983681413735110333283178158385223489278399999733650266511801605346840585237385616268063695322957138654582235944166245659594725619713797201642191756599874515451666475083116698542846766377843669720970020215801765619301471141359637785606520470166227375727849861216191946515111707525107131721619965481593540288409716322946812687579322840113397726742494002369394536323846462913654215377123920474962263278217732075227558322278872356125099608994297299523153302474441144165600656286238052974690926308270012844236860290675531779106466818852105137121151564218829162698979396118800900752875760085890820078291904459406770766339671657919847372968378960199719074722741718491153593023202886136026893868950686328466121234513928963013275555390180015350960836375324862548603958308909545835507057550112880959855403463117955276531656713868534568437652519460571509469950469615842172750896238530032572417084829694846228027889181310659585454596307625855591460709249950184507503887427974960740982415814100957748126853149738228835956605623638227378189294888374466235357712555769819391880109078045313491370323004824409715791171237212569368377298409412514908708570302738133980585789979719965861313680783506608476266368115497136989835821188271112411794237902175794835980394459877903792412106114546423521858081803249203077405878256139785202979281454536746959431851515603608782194576571412070290378433981752312060114157525176384698870885058894937074304074633115080539299672340947715470630796691711924686790077313698430533065136860139534667774737939798102784293310707344861903978812507426000004224006366103172612695751999391074299298976687584446387970155196150666751677669268841773610532979523653786257526961509519368753730035867074121755111609829283684977595014509825334138196779169778047692998389673963347945966534618482305408426190968048824912784706729704813723127930619407927721400873709989099165572433410484841606859569319794245221440456991589479740666689791052294731679708822301691446336077857122093787033265715392467656264895412540362880449767603718375450990329995155327595881340965301443861287736238924058515464615195285781331714767156772874654158317661572637482800209635741667895545477671005859077287535203778042675050009769499032158322064276437707443768135094852549924556129529169129748614154855080996894777429268571496309561548330447030227607479582059733928768376432274159327570447999081306942809160147325100099826816866953519492072743229775367258314828461405348788048226569594179887175675424458244242986909490531847679259875073361724110165454903800822060421080612787530709967295346091632763556480262335056325257283189557340130590091961213255667322318956709613132536549591804072176704748808762909095852536978125922321102778740666013868454370944878743218250922156776751374219503699382028506220464657677318400434325430283379010211454858229204460905107900300294434801306293759340122708396225837859875141438323245676785277732351775081381358013352342859027882076571565664604911757779370189625667976654545889046876778683332104147523191944286251126463331927109748785171896247871882716040728329060362306285903519998695602325734381766817466653696516037737357042260227456743060065859394386668387972650239497655948563148252983898608214993832649480524159354326687896236316769227827936806048534428298258762235655850195715933477281776630976453124830083347637230181211970097195914792192850779911243024316214555843956211518918421407194192549640303041683449156036015562485912958865284325507810250263876391782970940381097145914946807354293165467404263687409027508880008521085434195659114958017668783633245865262009751318495245331147870118485197876945842036325970609627561625143425257947378768753786918397490431892668239074631582226312784613134000941112488981673936759786385904360735001750533602140446161454589683581842761579775740836059551179316456191943943829946347519410112037904820578840161192805691782012054736772912925222754827789983937968676820487540543843377341082091199326371474393709444700250306191878046757111511140192450689129173839428862050265401476648378897681012967168998697259180121625822687850344286212886007298290063226567028176259984223894472324013806147798316664866343224601263076243704807424879738552040909060795608211859279817729208193288648533309205889425881624015496254549899900081899582319882388519124712028468763268180835061199637183304093082716744785463692271090960507266666285586100754449579851687162438210247609404575967777240920495116250026033721896863370148829671833610325514539742753424331453457199644268653224842708867803269664897225962166306616854281494634717142939974619755358614439169773086876069791498396891697368884811520622446185372091416397866338075009169058715906455100200278754240692495245470733710931059028015854506660021350682684960500978648924163788565198369959608788780560191798482782211148982490439449583241856944852728289608755245416095715673050539584067124757231270928185967473308620439362440800650378935924560260640580252744495122646212664401407691645306774683018036730346625242049389851174494790247857540313341102094925447670057478891802567140394732008528911829716962255142018330541805331363448078407658863687851294313347085189471281236178882712546552055737169460053149523959054464650755218606717332745855334404221945040539147432818404609056190895882270540155873018009782959659978520973597772613004017264575583262027408159155759268015555696184687617553600111327579253448222425775090948688169041343026729163690917970488895174571184013908096820791134415766335019981295291523124495394392868461940483504974309292436154122853691825439049119936196323070270328395813415019973731439098416168050642544918279201159828562072700396859049930138451609989728613668350123545578231088741556459094759889984062367314681638336204042121589617462771827824509233149860237008672906541621244382161562827948941202112524570933035798284713309152116419280829104054840999613813944096467029940368105902585930314027835177528219547520887850244388093319399825325613106172775330628659878884225936094400879351596182793756538559584403723097502803065799804582685778166244455234255724363745719048252965876620301967690034282953286181069287927038835022324023295464573482491518953951595470352764008044732418060088395814241065458139060055275815633599524723541661630858399192738371145593163992955801039933055604724796391696888386935566296055370195369561720748664945276479446390930818748592748727014143238359871562434268314646425753968148743175144280718256538405077785411376256970470311922442837045694804871507277516420444064667650642869607866272610885901436844219934865328678110097080402617844922273097637213487816847100818383013481709606131856968286445864700049644327931048601541393018661185520007288068446926215955357942956724973179989646242464005377827775869388998694343873318968857427171380350139104110900557710718519638477330813299863718576409469159982844713200447410107143401853539010102513859152747258492551679871277725863361261747561212458607187484809016256901554635849409399423757317400927577832709564761290728276959676129005562831074678409075256418468385035447497379406068821352768333848289572478345236035490636687435401434589788159530742032377669407487904412860243581754098623096728292441916232420280078777809097716884270119125803129084288059580820718111323178754287403558425363386341388850422643746901220790957596426020129081840147209650598675390489001377724563929276036451598231329252595699101374045686755397865136177853040552303288629370793364335489115657121720813579350251151776172528184107715658896257760038266992586362028524985775855572463230030665705665508098419622981326203725197423600401193484183737051048272542270398165020694503292784941509381476907903393063034455792186660188085198442205570573242028512603064591946954751346978065179166645041264314232983575969321971829779874761026303212179523822333055057778827062934533696598511002711131141533119277621179319107506253516511329772548553910138099130537287717678891331004022674241659385440640311326456415453417806027044913494712276899732730343616095278115714894389695285513094752359681690832822845715170880914065264562427498433183754345194517499344309014997136627477552290941330059357780138798381715184307515144412602958782458212434070532297006626964329193504342624691828146863826902898275896062514042512802542330444733112689656914638191254358181650103493428662556550857547240088139402039290510233658983898318768273186386081510894353435527696261444772830978007839438801942428949966574717214865250965571142583181465851062174559201071634554407393642953831959732596765922398123889613654322937145065091253257340862939123453044573396050773159568219633433170554894262878185082864949959616740012796557214159634917431092403240823165315225704412479295569875494033253031337499983547746721343187015320955180626104897885143397063468333147884598162522092009821124577410257792392950876717741340544993239009502849573746198281498586880716607502777188395980190426401106932724649959446623599405506370493335416153178986118440659769699800927782442443227440675688402829993362428661657043738100029407575793762234433108368192756775897289698874449925949407098905955032540229491091448743290767355045665351819092936614624409458292095947707855410664107601174630605454618556789470389929647491554785145319817774405929641615336043327520205445856897415272312469197236853427646883354818248341300930476267710465484092635095925757851335013024197493087304275534124580984544345655563869340966868987737851525985962650183067294733144031936263968989144803534075174444957187890773669796452288477931643151522824893283401561474756306033659973708397212799400958399763724326214537265385308520314690937206346688699044269991381751819980513534182275813398253865222785627413607976997439890650444333391561237439683318723699492936947894269634710983929922498985505350700159583407072995394086370488188215040685636489431398477937032496450766642192092460073649517121625146509272397594381545232347404542545091812498607078417987561073751781983335741377924268237071379748544987197473992477006381382909093402301707102837831360893363249013512339172016118697644401441695083843114186544810048979720192999452680938014545499399541068127166854085536075784406539573447075394901701364231809370100136511045894438473164373135726220986712333267592425509871883732748071248254792544166721078849282002727641852355936685637318596471974937349434713332214938550810516138142375824408357619596227336023715923138197991046827229502606679124761379480317626647516281763626897237513455775880681975908721634206754312653665740437031446987341233883880448087225934684743572731130886630238162559772654849525541207843950633442019689154923028948392266963248590437107735943215352526869660029257826872120625715001900006385917372450861095698969540307152700868574196143610019365859064988641096089988675502940438039962740524401719391271345444330316364786082042970335079244124319650703918987832706555102166369092977887533914521019103263829298594888533413735453858064076774011553147782073365584118835390816718343165856843596106603220621305281719344916594830753153151248075886164064920596568463669621805034515659140144324191978323563625625755162704468023074439091366211099799807614980651477849466762814338072713876116920989962920440062298369798739294151682162648207742666355992525897946462748755326571235820610577976877362708597132388847249092119618654880812239405952585838206196867452977545000372735098932420300357866607908957041087021607103455606170676751810110096609724274829699614059554354164220931334399847590982535906898660385969859839263850493168279330394967316581798958061993585749192234710939336171419178517901943765588572858921504365428131094505476900630442348829075627088383016962073445698889284394966623941140775099246348251632794682435233349718558814458254139940471573220485447475807747275931010946604143333244532476405519829206993957695025269106575135568779461003835866606613787657275588614762645282566611734732899117303698344653225959060432153784613652411469895948064561524931763883327844878933936722290012495710970998204829725021128155245230621247521724189813562148769818089349678797078920169530931900883098484335313977739236867159727902472275088732728244749346039406075421075906584596889891747970368569340151086964489273393136162669454289768730875813597574595131258952266357208155364093264522069953212012045376080137608483978547081321601944173476571284659391927907618636924829622182425863984507700289277191129803926170936951456759892929813764022207781126437519496118900356549605601947981297948785790633273967154645926153750340675836219994514389758560303679698103648897295417981267703951023453516788329857588210720997056582858683311437470764294547581380162209634909479007912256610946782394025343268833524869222621572822043607020677952655619667636964463191174838126937158479642405313557733024574746919795940949114313685299142424403401694408899506068130343922955671314053850679499248892158830439931327562128576379834044857624656198356585230952199589679129731945133067835580712119364031902965115337176650621849165004547812590842782072429252996380872646438603186526761272003456920550491935265443710788528027786395799524713499363123006986658386446778656338016695049864543723123712820380083530636549411018853031861029061559424892084008777031579693750931624061522566702069927348946142950893391204630904658227371033526591297286982477109913359582177417794711503190055867480085717664081346346303967268731724561847173633630121153126908309386770256173375514006885570629060666157376033544490912306980678056825888677848106427077985447122696524867346560254957012307614899929530808201035993215927265886569320430918138783286468494161016729859306031901913060727676770880201664835775203546276042056047773495474111147634364690321019841735987379775454023895832557419429470816278640267618575214551750004632533469449902246751822824086142878076397956972459213304179388295977160761303309218408948794254586160169051349441148893743461394908151502779330670695299062498232746268924500235762438166346673267525320719911187114518342784456952823347949823263549724668247151092181524754224623338983371389707224407224779637910923029880782533344158004795008458574188555672501699270821364837626318465007940302933424619958303937401605512929170047586576411389163496779715980615527702063199792345373619152858811323548242675457473889129011355072987443727265873152822250683646012456284817494460799096605375165100153494557407811032558599009122311625235050845840218816090550246303699866989010773157269625898430699048315511029153275450206049096637338287123275476420324883617672938809974228039144390604165970501260193840058532838703499895502411414691832392251136272266552015911771208141356941331376259978034450208397030859570933509416252016679967575884947734825687986555873373484157666498022497842344982954157974681372425659546430564005731663949400747774107246948875047859865022438992193375989085682418339655991512866003467106640499838772199989702051356927222279118409773675387941971755222947945285660219056887232864933057163370961054991706803080312503508197712672630237399809449078709907252018849874753302571501718543328292059780150043305257473541393699286252449627603000593265489221842274567611443759035989755280008079204611431476999379269521720841269102044799071534214952961693249363363940618261820573860116871349232428716047779529960537543908988354528136871388411563098195003181499992863507466003563001492386256314856778679553139032770743433511700519523758734356311859524572468080424458801808705447234348279751513690684115494470386423578975889272350782435709748797443945205543107308668720632612544195868748705997293670119124765858717875402029707641054574249323370912337695074826934617541020554595813133929709959087420229119875768531856120238911633120200179460744805097712145733286828500083555781773418029680496934509652877942510962266871943923100912165013266573481467835629629660840174101249579627078692647142671321775327564520905323078137539581372735818792766236832245490625702617892812127993439062671116439361459650459094630138302205134026762110834094843585807496119212478564289898273925822009025278330397688333671706609056534099804517769174380192390596344437625330313206808437149403491862171357380351329746217644163914928305039770890782023425124765075413694104096008621591866537655249545412272741239095503838989164328160436193053294466537564993958361657448627430607306932319222211480315463048683713728364882431219069680102219466008164019432583600781386103019745965124789736683895145970491620107260559580787492390147786944419443878149957150806622399314387809983989046486848037871876184436787561792159875173752268793361262015415822635173545833884190355837687394922244871506484884734769376575643442664408996167629841453735063032542673944171996660180065528925302578155566762792767719346453259940454697731764583409002683079813387389029360227415890064406143270510280752124045095503478623560011611890591923051444027340855415272307725882161608945976916900778318987084973943236433256386228780546051572044836890928498608931033900968075708608569232327873911176263607105187421137829231053937506342377134326644336895843251708576458344148287561200956542585224323088053778444493858890661137260543337979945498320573007451004363325614026334081303983465719925488410601720204156313224359104764539102365577195910999029480841781483250713675564951499206758531621500050545267530825285019949388909784283944148020630377764544094799004557942084848375520317064697539242675145809338963618930509049239027766663217484916072326425135130368593132556275694748199652511982075592425933937317947532496689300984980227632961110828559306959064101914616432829760353945558138839490098943430739169109707089801202326922567696070522127241964055616846360805811383128344031808666643770228116880277323522641286445745274766992590570915688936213551711090639459618278768621780492193258727163496609106187655336300418107678501916894799840048467105042353294086889765257011393914959978683315124537323447230862327653120552465545752106843550776947025623088826459771093750120647737079059774169694951178833401348039900180389345147096083918281340617808204040493221996403049552784636063989250470541613019078847438370783239770476050624713798611950563736767126693952403315567309912021192414433128492976684638460949852870024358048522458136517125002725328343049423841292108039393006998330311867866363194075766957871346669119117588714577050251612937092296355610118936137207887277759970869557722023707723264511674618512243526566816400749693365738591569319121694705743282903935304258067613925171312512914971301861215760630897513593656695467175134353095448363428474175299637983374134943367382934801434437182133234913094921253653754521251216822958586000697894884062137769716507529781825674387096692222705578795471319348225879900157880733374533133139044058682319003078501914195662319230190451235664210483506279264374405081854801638455053769640992029130851048400010930887992516921282732048767832880369718213613843895230055065446952523948869182187126233618823732549174834697742945702725169822264227527705320785603801046192678698280839357718272300260605915608249804734561495576445482380012255748802730699487164294279234239082066254127294600654458835754022838554215425045275006517529687850259262820585613361432139439603809005093365194660537670922556745648772364262990142651841162184767119112196809520336729856262650789851615200916511056085566860978531673751037228064957040022973763737611208683736774842062424985229247518706827851208654973062385816612618940479225292124880887009337717752070088560686729227723982374350411617140647130371803567116550660928521791914763752021304112341919311109853559336289835561699509436303325455852251549155256655323768824341221846121064359230569762118092544327925184952079203217139401256542176286145498717545437432783097922310508913024145330442118388897371731662192882144769755825281856312832309283416002551991663660369301249562790562106631265047045519597763141967060863062583220350116057320951539643481999765246845342507608554449085071777417983668244938714885029181977660978244382705384831852320546750047888042338912588155313428967196039391298546886692509674689883429637329055281153079336310760494402562158795571153177201519423446840393913775556562914053550080594231423140408986189048297855609623261993522323285697224973981428181147288417252575701158168492160714659493853096327443739492611296290226648950235420714911909608242117392557244377972321781333932551071005061261201333973187635144242577460690858229501637410295380735661135665661008961109741261997214597374386150525064374879782336293975060029282633436357176684728181771153617144305464839443381156935322358630521226060732018419950138598651025332408058133278532777079283219998610730885513086795159095682493786328492439895921515114364104550528265903817930967389382464649506557303266722574532850764673898494657663989993511256871929146793701421601365997016915075983888773345288593396160727955734204352459564913586507982883414883614928714246120002835466376327181173388907905767840957812706341728331527609266362264708879229136004550894149173922635629309861694184379623056224597745350248276373797984100733224731348391753729137593647242414392820113216688168289588270906512670192483034793420559968684522634651786771448060337804110119610023044911988849324272247962434230468952440527717340692015977659140970830436164143419317792797019826655388849627194721688331344337311340198108935383497122487748241876189824738821422325056779735781228951497394009149436007827029581995345295936393211164305878128178527581110476848631411230628953447609642718759936497726677026390679219213449647469957734979715489542847260397621857535509653095335356287537904402328870300527921967378231569552683259623227139150727215901542716283313747370261712580871533443945896134003430470402440082835238424938149540945375092286702816146913440802137322128848488754641017884771490445532940958095886493259044270739019494638226148494341433162004717991478619243482131333386901228478612959193653709933577231430762803441434667374307273415282951375650227084641542097780543279251399923556694903245533416624347022183119139537373846200566400193379931743104858570651370066978849559599282326669003040896623147753358746795607491311409540271339170522423806349133819579038050251741684563121967279912287990812283246698922860376007850978812223540368315230193237296218081437967755254273874892816021993392458337894746121685343362238365768092457614825954391941642239265809674900591639805140781073147803596649722524867050017504778012070502494397865475144563444517292464499728880272649518110470190668853609516820940509392338367412179257227291471703785674644302582600538379515752686472229214733692387963378351735100149654522152017454471132860246609331424903851228012080853147678229066512409780023865683125537826578872543564789175117542835432684855704219226286664775328570248589351843535971166348369527396740145230778650453194167180985139631165506305247073289534119117599373054768141875845590998689011125035620092877459385972096497414433731403355005786713518362930992877994697995665476946765930295443037571287053875583585079009330098077752393990674575523819539096579035681146901408784310892988068456941181027622361965534477858044613806691547931273915759212044618898517388119780153330872975654261436030676147937629024667012494505167364753269457224138493520163760519722616603648875303312140832628697784322108617415429404884846176277232473590438437890289350990390006188441295852027472101359939432161771432098001206364324260343994144782859509516318708424196085801478671215812187858859057299983560618315535998854327789670119263919182636979981506738311984548822096535839881195076682417136625377147842100257407458565251233286097270403783151709969455384388722130905164619829607398893309193658758764307370182751681552472241080459295112941382177828226426473858358879208099878850273266844380219001323616324025971368537731003570213590909460987695112731469642444727568859017660583946425175302197278851005315000441460498995804023167710994116403836158256065183746062682780331781630980091951151016860012770065975952240671009784630791289557306510214938645775043348462059277562229676163364064223109469795536402027371949618548862623255149181967107065043793245289790070789407353359885210729067091205251571688555653794839472534926499734927827448126139443453965662059255312651783361371550479956290032576816096696457153406908230657902905193156330848327661060143386076003369967910877571329598618138522333190189057116029673711042186501213118597677064554289844140372704112165738516473945747642905409975218470277422315099357798578858437509299312878386080832358713179286645365053170966851786566747203310583284772030206280603925501266255246083947144177155722959009318550454614731554316252262566246009857961669958287512881790245700370131632492511533071239121879695070352354735822848687788375704856559787481404128510941715485507454173264384321474310314916683583889955490066827884111897631643703066223754211819988335361109781565800594258300621336271092817043092978877338020028140191397249266459600261635221400177297420460858336024282120077977618949274487630391365694405382049870040026898339002296470599372869750162372630809098889205668892264700747821450179011510727040928058424096233963027969478078436246118246073644212694613015728785799078334898468358398240625426113880274177348132882829276597485393339891314434846086664293702553266963328973856199414888735510922009297833024555237112616406635299611758980285547531660178529862120578362215361129178360900144021521719506918724132972420166809273643498099173469136212749009285524137966199425723571464169028592870034306231755470956986122509469014607009297570387457643551241044554108187178030487405280320893112870468950310302387509635036117166174290842233142526625285199234113849632288693570174665728957770402617611005541468332399289911209196947279120582813811687313776605948820128997564641301739355610718736423689622601419691215371004190245554888411658075089726479419521617610228767886458489648430112728445636803993798970704035038772077878936922459214901643393170719903888961265899914635601763357578468228091977170554600328565603857793346617289411713778852520562461051599124593693211665780713626271351075407260166065759680445578062003598966209732044655918531135564345008736414058947883989801030969722304120264569350692411548467108078781666208917489208160530889330669170577831766092410894769110416772627346882331228656209246529183408594619453535694818992878876689836954495295380377266990408029526382891654665599957051783335218527628033987144503259372511629422100421295617333376151936087848009970339338642053183350359071859666492000657855180544570758339565859092437073077455708953128045636939095106615459368546767166850625658615570993524184840214296160551719637928966939949487570684871530379989644466907481376265298755032021058616908673830033397565436528125162489416208934900157218829840642605391431771286234059492769628080592157972323784084619693320557706232231254016464144696264547480889008392983609957675969274467639759665456457871454296861043753893944347965462258991983891771435886529046214669444363092484404685013655981891975958772057543675257021363690324695417903710545784191751831406635216818044039834858083907876273122137516989090164263875205737951141489100147525618233285288191613081202283031715615266475348236160112932207665820491906537583725315633828560163125620885110618735396927901590041842941206294282531840889298379199411412266895435157531325593719500957254950982638523958537609237620755789819872082895748220075521439147730831093892792045186986880999965789473656101887855830879997569118637197128233620854617941485946035775846341886741737845046349348554867086152691771197025835230680139535392313613637298271821958285770169926976749842423166711708696700532051244310606382701353929568713613566341678013507319364091234420563442341786768307870115635585344747862006876538535073627440441781891391607981498394717762984580098775469547897114015960601458752958454475189334957938126208534476341620008022454114602304699601516846974569532989780629781804318485695172892813677718152562605846870820065483605567368766363719542773481511455545643740749245473269092706713955194026121843948656270025108214744354098077923852579112581863728024175029389719196733974006613034668569786058770801779926097743484804509640574350576582504568787524620302829117967022208540102845339034606284997830260729407484142120461810430342816450943579045160112898800153990509555336434784930648000178564025539551943515576437340732876276388436355209118758047050783520599083348048987182161954325778100955824887715303979487351919703996030335387713951866454576078250829382264304563103458234207329869870717230312209692482714471216751976772336391647795456616565866746810371371881431059618215130729906362651515946862081174232875616359098910328170208374830446680273236731168088290084747870646553750338108108436682192643013290896896019642833041218119882672177789389854311977713624647906102823785362150994174397798492808598783315897805391045717515468238023549064330335428014790946329300814514461115640724929320802146018011303532759626307544814168883987629182687532760043670284476573329275000434485243134138219430892483142259222762047589967934957886449033273932809699743853268406560594952583552374002445412896378653134844114851340079606177964808697487924675130397763064253911138752668192949603715118400654835992248641460141817420041866009803132061837984766728073815354976552440256293384035813469234983126521583944627234561696103490417090637490299923209581679798611331954147543713284266225832756061402089612029531916212345151308103877323419159140271963822085622427327883256450792495621522548591870874756356420805353102971232168613723685787079077572264447964564342612590917787330285672267629655808381941081521326305931196169600642917559098499372852274372733596857794675188329847081452813016324260152378201479630714698161889084282956116223898426957419674838394999616412543553999687318594639563478814769132305335195033659438011434037565481921919972644809864907661698998921423243435016289848956601333739510061393732604383851803699555562484210953169400183454184045971218599191151233911023855780902269749202016413412975446075325545198686022839794045444990456730566996630494531905552420843973489527944528863818338928938396406104764474678609961829913900939625401876073782392312731176644155854088153525711034363455260318375480993690651315750503718444231465125839792537691946166545274310229011687570919832364917716111101790229821921498059889695576023077763051894431913985841014877163779835204113070887845195979433140604596222836709468612522419107465945581078384151240821184549380021023625534322540028221067538733489318131502746677262606281218204707840630955751003169162977621624117678713950785684385058553672824065812394639922807795676681840629981170925679835294679262360045036405181298615937241561888475477598321289759158101299353724241972212041669808627693456793466866118743107742190559071615014049604285451213886999970244324888369032936168018048754241947518523603886681457944894661266244742885584766774153164143460505878533059935603364492702367079219085987542547755156843741709785026758434435215620670184746376344304535920238901754483093474177114730103726228726706202582171439065393848118755203243098004335959633504704514695695804336137356021509375403428344048431455007888943261250841145992126323815568299951093209047009354716485516964330987022197593917615506083874448201067606897933129130093822709674928308351673612548316242314276036261851984863695668636094384215529265892351064395813522096943923654405561024371071198187961548926494870421357912526792565211625341836047503031742540205961000776830731126379896259738331158673542398182318391422592939685329197708415846535354915001154108119936638955075080202595797782129204836723657386741661582158158656793517909991953080506864901855379117813360096895210378937881406420488159725833032633391173921310005858504031645173258539777738721278744235311384029638376365847784550368948541575519615997752882028204697096208421168728772395552416465722978617843665371872986239479503217272016993326281835689588469120148318431668544466121092670962865488423382144170651616421937968430728930356757181144672202736301589774799373913478158640899297107032683336630636909347092753097704578099021075163668114376186929746290536253649380788673179478736282415847027371572387612581459796461864307590041903768342848461881799917661883975645465731684672306300426534692157074692174789009547494250065880808006789849738841188975608842513884914379241356501441133840583024062567267598601781427188746360630321521330481207360267049674266726821611678733733962616577449520150343594729528895400713268699879239625875960904553251875075164865370111653689163623204396911238545028041984158452215133181122847546332617942752924773195261322825273192329961923688649032551047242525345552884300912360645766287811016206083536564161926847866972429876303234343540904732418014866961994544151931771896102548329712624586491656736720688691174666194271110025467684125406038091920264878080977836831392942634843310981174172587506472223941821165781296200894521930425673254492589498190968901795016578984919182537382189189713201576947028801189934252785337887092665237929833678912682507392553935971910001363614561152678150627147040647278477994501017141310264540520168874371242170628653928126156507267476888622150942864806613102710036914860778530229021195809111506805995911165004958281188393931729444045458064571014958795473049827594077214502148160233501179921669706336099908894921581043704198071163399028622914802884758113084469165851468738984200425143090446221670975264288949227830887731893094718360489218730627190197018561021599972441345109868638624819667138289198210327235037684400552189704512104195244226609076389824462571392838736020496618113494025860048144324811145506251715587299983165985479435615958641544920237366474850057224293079166146721418482899749376865356995234846239619781035205220661400592040814664094761626325166814453183167115714121004995443574168340959372993765148670604256770701801563904145275667900807649501640701407477880618836586310072250128887548400863448369233111658717712869732992059942556435213148104671131646992905857637284499374134778546240348660623692929603515842958120760486355030125153354124613626462745752282489626089501886078708789117464182392980108172753947560468883991029184558784310061061903642863494234063104533431105494716282182694119123088144261731339663789736867414868955422638595763644044895070442249580749807875773766107374207384842413678767102898066063453426193534209416472290168147543636114891025042737821446396113873773239192712023254781906229177687476374383930430657297986283809191727293114925817178536482129182758292741393076735120129804791478452332159214573156737869741189494118897097428010267765064371430984198262630128532853079498300123511733364792453775704785221393053519909708396778883814291222315239082064431688848314875804016970696451828477508636087750449388522820798304561217897010897882857180805571922665669335874894509504853743464122003771696976507310851055446496936210301516110426461591057463089736472134282729978777353697278666745337377560251813092646035214187646756693325077712204881267656591024993313842388461187787995108546776309355338271041290497215814830425311243924732866071025529525967296043590771511318967191501951735512622807005557811194391107696560625228856076277627365980575901090133385575157630848582485614647437465233356614546064879772702384629243385345763258358932711497256401647357341951796666106635860768961355883005415391308515320307769346193213970875234365417033477332912041393395092634139965878430849254508813797529666113494673187587906684976012115454900731456313134386299578626868188081325013200023107532280720424725696087975015545072869643910318065912306477026951725354709644261248129173311690023398826143526697808925763314898382249776831520075164611608211661940447473869971081316646821967855656166063141484781497019419365702206220256156927335863463725395762895017978791567670785431919651188267137384895343430078485390484900342492870756141530466327820944753884050448636488945883602793590132265613102625939505085891245884050853254829922403440525832313040543824712310609487606012844386343091382808118370974823484188950680565673595084783023190857369277446265268963002484171515624826187349299940324543210058020880952528513120442559262608874825487038442321387843440198195245834197489401592409374330842373195897240859130232643717744861063326601605905436918942632017561698614496364950282033972101554133093002889173034781332519384969425054367606762430137023791462921317023116260380079187331228716489278069389175079653658543858679870522525854693054092394771367330604538674694911333848691784411430107080384879481686583609246731853373550427636266771349218447091731864138316830836486478310680600817468725193952095885805205209034892902678250046931416524419686183580535791853852447776261385060777188922648315982669549520417325617367841259498695091658113326264315640378830062273358725364788092122819061211036559423523945385685697404623736751377113122593702941358523195870233650890266505294153270333975213093675030862580506142329301085041192140948139697718676131594801638592071029838441550719686772977539761554130678126369424760485721677249405159934717825332465308283174202921448590793698252719952885820707888695949199366453201863724360310701124235813183526461308228282740576258069768204474485645454448654520137796950475684777842964774666686039028068981323075901403991397836026058742838866545351417831790804384814587366384632708132026447606594883402218228142435513018235790214199564991273327210055586313142557415844748101860661102602221124442832513544135530473243052282850042170746209343734419421549844070131812732136176569449887141950634775974194205364323550484877290314635070447122328187999199508548576046738634207581911918506699085697168519266037421158204668675248755951751057337459102930056013016303701112052590467145067491084444942016124195731999595454640509908629115890770741401538912466173631980958280001643524474542554291996025053832558526996375456172280066532663266527729210186541032325002476266579176015820630652078489908068113532893566826943407813985770412669446889294605408148051889625161800346557581800477360080934902678236748869323420774807176455901917818677576085156088314721796956022058184667474205223266840482978798020219032114967279432248482520510435856508360713710815654426576779567928484145281335902493254368468648793862999153891753805657167124542743626833411504745342322522911950114788786339012475314617874132172118077757103398075658816176174823562130976579850480953436253290300419116671371726680850391240312644829367915212498346779445123345224567482245443218636405514158871329064624841419069302685669067788739391478916299950566259325044411059170945313327181899972500604425591521846977932838123304297877629546964221755026612310789185910120976978454317429181581161940006390781644255141334152228336426283450408338101672961104328997368509014212152404656385121579301556202462483311976413237175058337792998653480497469349180508389345271653667030226051326361819837914766738634156888446675838649767407144723604278910694276483007072365438242845519667672608232856081403344179145669910380474021288077495311400685012872655490636687671750930308141221100218622546789789323209889086519516816632673495402843810992271316991506640056254703555313579975896088084000008920395897646014235990264940172131161755174657306772677747402203361495968146633889861817592276102718063972166395840773162335131994384941032257015356694959445233811110441474456336880257687139734651626208893742270638144042635731251438963888181259395539135160800742164511818727397100974991204140467923487427052586263428678683346182346276496600865383316274623501343008722327421264980374108034087009960426242630955315445644241614259359960179846442284405923288241012872952969312142001076380923692207783790976659606650476897761483517058514687262716990900410401580048906623603405527121529291713697240319556218431575646739804371105260535651873661519300269754928348917246549711973602827882273834281968643058071964944771252755459442629452593540070548698697258473544045866454875061014208704577639312558048834280899108316985273357162807428263269312700635202154550368841014030623550548239644222812624245433611945850779251925535017459818984001923002410482045241473894614632502988249644451037523532299330220502444014522348678075461801284454167453344904235709654088933754148588367551627063013657334347727401560933760154144424607966892722647028638048503138780756341999085535688363117084802167862293506210924450242818012091891587288612977197421271168536869977120175599472879117609152558243102565240066140610688848943380865301292529349173615926529334682895754404496879096252780048577692056169521087578252610896715716489780985721865296260340732405793628660587909539700719112621379232640168466556017361505527281461194496291134328162298805860929767077934970900984424775377959727746204035236586173107481793080217753218463370880693641585605873088858220162887310855737794857892170072417324130087950214451046576517362783393887014643885075356687093001344994397365868539735411405013805597313197510172216979649674669342390362138350578163341675337701017423775216822258021054333402716878845841021665232030402177598732759325926879128568782947895800543135789609797670971476678728407925811168560513205228103218180871981258791417952541625563599533591785627131924727733722436616835602409460445947716199805757177161895296066582555202700871067379672480535667089516964223011016733660942736738978177310224422964113846514085537716868937006815106488640044796423302625240868823249743102039997786577791138279014975987275913675077892499904449752701620651149079342337260087696716489310496783868677767237123743671048838411040684280501603459527466288378001774379010223751145658539432199848698865608186893924143810383221708174966921353347882321496785825199966692986953347652463635824526220753874255128481535874259788764473021776316787378237375852742364460906982468174785345554849596564191813972652580188579179225988347442869719283208977832323617003381988532742829943368080061931585259220051688804502817003583519704359721535530692874902738865714981742514735850993837014497790396961157031518501517513383984627786856272735568456685656198600856302842368224612108740844410438944699146832390772067880006255565951090354352337779856543895561372684858980885182230094275867663965986760306496466688904471119660135643568931201865701462368393819856119256922484299482855415949150480459405340148073931625031187822826224115118029586743654409840200935912309192284667707807019549357133686782755738590173741168190973484820479553933867643068617941458195111362553895696870483472192109563193466383506901309701569751044206777795068015518141201356936762073128739355096912407753973370599042182879840898196211379590465515382982985473020394526902575141226835939263545519653298354650390917226690746493265146419128597785304240397005493081334456197287937802394124645871845389324182740667712659822432307416883484044242922268738267961433581697375611062641662840636334028713687555930466830185992737771630741129921111553384778825428299051860331886584408170115274240955767094077044935567552390615134129384648213266457840853734593240821064689813137709766832484021226658113921609013012361915325136384816789658326002327260950138847544737900423797255154786825611707473186716731527969135267485780327771605565362004926308524466380575646502786686789445906975511550637055052741464242872482185608299553875498559977832126853250245541022382527668987470145633867072015873716352151995209760144234448218462356242876381004507155033367824456062736658291403207961692763562881944111744789241134121646399633480412928544857325225191957100079550380851439258061716858090391329803168958361225830338770989232116089378658091309958056578271802361189823466464702663798553010328495950872345462910696091773655838442607609294792307327325018784832284805317925329781867010963962202093066046740425892559287374994891864482053914249764881959505546449748755209339716117699609229940628743543413790963808989654272156831441032375338086590572303554845368172237700393782821289440069549535693691523458654255984561691521815951577326018300241881424302458990138507156454678298019803034237931286012777580009196239775225112610564491697951471040562097480782323308662675570291061808186075741612189397585353660547619996346569306331803427286245292182866746942937252974029861133277387327171577752200639955341897709143567236523117020020621083177734417334355979276510019014047420350214524260766006789159509077688964591922667579981612079819839110454961320813415046081116925268244787392060871015837301881489091709167116578806269044608742527250997477399702849379677350786909090196878979601639537054204017807525497954895590000246267095924628433469533175678581539418267237125353894078769514439034434343698823680226933778864646192007866375771258217030396874971370191601381620879164825505259390702352207558130559132228029520839146935625982240346454216235861705782626946563633784426625282652217046674077437914408340187964634468850541997766345386590459724837742243495310779803778214560948014178021967746606187167517112946507019746989674503189578231102667356912644864769289364661837368913562366074511521604350142136134106480754655299506346525467536371059431226642193155431396046227669848830396789776405130883137747505983450488322896135798813078290892460723104260537279530938514632323631147209697552915688196840108367546475237256622738733972894701880584521930446569624420571682634584777946593675384331003017125903080856477908500016779123574682275936489392539232837892574640346768088577208560957475326310726930761940345779769917488210510942791078241272248512684696311467288082473694123507458464560794052130858581600812880723689640108940445223390161792132704281236440602343874163205798374903963132830915485031059123257153441322189697921926526282780100085073825204335361045344537792366465396096979697295954391568537819843552161542895754025718347034846163651613262201708944782284951655257609004715197927361808339776021075936333833141375364524281449725462185956268872314642393239402343164404766641110214545353019662925712266336909143646241294135901819345964582184330839053465750824250995517974186061044611025133473277396101592705739207845693545470570048859399508237547355255866328886673189932167020707037848567242394560170781642209949416119154728692977969829732226676596926943438541423622991868655071705259067000257631209448696198376162015336643521470517965952578384762949221948092560072924902978104454012206037620084768454768309966880373874866152704944418571708832420924527306736074658714638848208294712155091897268318268164592766329123545347915818102939364247085493358900774124640572000541392696291835401343008646341246467896036380499210904545240360507351947134317671267188833405906651993259291147092943580058066432693204985838339031843688765244325538961411479401841846824797121630585028356014555505745305532387841589896925598992141390959082971677277000905257519507307971711071320708178730787908451174684458672112925873418490746106840351038923220794621217502521616022778126869175095669323954882214862839182983585424307309345897563773312431058022930465595657991485120332086209171880672607655021864332656211703846103136300344488754916530983056954258163609028373599461516960368226908191949792401403333165560508767398065454696713724127212223010649565714278433871236396887122393483587982014167422583197160605318116637807887183838707605219278839798316122877508838909705202003710407587830993416208222039336483038666657305069780806321691504248994236824846540405429784155204466627943015742544940730254479714805105563272656655438404287639113977654342263438185917706504388263924624161253132070503183928178622605706452981473210056987691082468012625435938238734290401263292710092463033220687857781006517873399700606939289778902382983582417671771907551050256513311553437995267821985799856260378581498560989298367767417647098385925053828041735136894757658598567423450396026391129694844507956468551019929053016070897183121715208978726285687543240491761476951113332970551718766086038529602171845630414161436976742723182317035176130085435649319323776202956084036838702357811784606576768340032849657448743473900104203387688908462527819316087248492759459278035441824627769787583012428881541731709358185912097420578030861621798962774790615287347919770917040480959846572889239299206733167185488363251955975625775617172870376953027712871565880985202511988293236584115032338590838640852685168935909317243324806304613767390489755086401111464951466578021350020931142530834053190679334857920466650645383123710443776120352924334362676132932305136657063370716716347267944367183900517116113198058356833034064472773764634543844640454948509700027771534877817470788756461027178362904566637943495336593765062971696907143824745234347966440931743964096585453205263730758882350591775117808095927179039665193649336151981059265712649306258133738785737348584179041582873288869912530422521056470127432947549230036804091143474936363579635089904589019925370511456921465000165091139496787899582453157870064972867525759646399065495150981666409818768346183150519805715621101800950241629792369726236629776955379145452895307028891929673601523419328007328237171693283162593145278253356566673147443140328872922452580998879331030816704595398198784976482634007053832838747926883148184102678823319425241115090241691889672275823216322601491390630319185729125123082587070482700848446469127929467587448999659431058833749576782036498821151617683210627219213017861134819618785352418975928454623443768016683337956042455192259756595258943979329104133761219701650265378407699601177434567110025488014526636168885887202575676215811845251525442657862588004513946399231943333844756987689403445129768734212924198066766149629235915721068170663029062945931162692657951698363390074658488688025271014736333486307670081278351990955230493899027447257559629142103563638255958038044399255683633416280852727888038272606467304303678388729573964030134228900065312578441003222701918251763968577034381501198359485105943617836105262597873493592253232072167237306653334053514381970970431515015800706459941108341377282425605583753566448004931105292379196999140227728860422043024462906154975995321013523529685896008587882274343116843810489633088377580516734409354157085954024415770662743747198762171100417544532690925942129949848183672622708181598303492132250382911065713196751664747086989477685859555272026714518197851149066363673769802085441259995782923903564543068431667351021029110276644212275276174561361201900283057289511261431811540362460708611674995729499884461399340705200058251617876409349457812601037742060422284785278320270945171028046392663908330028157820788960224891305469512181002032829407874005098139704462825000030057255568774217532217242329531518140923121452558371689682421407986274144075453783362370650404544202250323891409215518041596305667569500003279790222856752887169813250231136523658350812726873518724470250844915496040195357786712099145374618615203686605282721944228172862056010984935749144184860437271815191778148201343141738661854263151967747738837039734842523276322463284230257133485726182770101249973755542320956925161682214113860323894519976365056192155334574348781950246171744440887943672463419786427832803954010417017502960584949623231620268789905588932594734455445936296721892346227567989705406566087143250344451081918473380171358271365568147582626086592630368001502586228614898510567362630170220256784807855751500262608017527661645199777472214652139036243845599461359560610514067751220995839321853046416416133194802947610555685885287153590573846060084147718672547056482079026604829149839469444542551225816745159516461555271564017506366804250552824465746712648178789563760641689413302243652909567815413096430692533359395810382330703238708364444151563374548721446614577467364956862493452022904094539891401119014454153656516166588059766754219637278687753738311336290053499071264344546343072232127971001647733701751647344914948707426997861937132050268306071148570911406366980570753176664816160395241146930619976002183330806917688230763880660775212099662844920629782721098353996382631505192925995997471669986852917468082146572643057884696876892706824341921013347423493198933697355699594341477134176962927497957380364678509276943378539530770334342975602923921632033437825466549192263875282079750931682190624234855124492788548734445230116556704767482644805509752696745382328911989828633464827589679581712958770451004973778193863324895611775620239949621103317046597417880675395962074288556425316828022868325777041293412067474273567359441165016127397575791899279579228909788574712473606660528515274595835351885887854666701982683545491699713592079632868154052258182414641785150581626602919088773148888636011597287481743465057758228719854060322139752288724627738354826901712311102079288867735280260419846732469515277503938257481181325115780429782701958882465181210753434751306625212023002619510552094434166979629697943649395694957888206045723234011577888702040950078248724645664812469251938739661518208557728456115689010042267200534315402769034002375473837536709666037347919864477232789708892777010937006925799826961440594454186219880164450014735224971007562830238114469217308164125215304126426753090568029499743425572869339001767046987224174386651210599956808562815460767175463754628092718047878290243669435992533772175570052635128538221772256402991203488340951464873528121272874279236069306624269570956976590194671692048803034724262025420263026365535542368195672091413739390200777380090254812296446157206135763566272703981355076380343235149056000052459115924729353594053690639508997907370768207070885926277879746586648821383595394240729848601398570096375811886441819959845566239741659754737631893831924439937548113795576919657347456308885133910507276763818724189361790942500189022625683554259697649182084486937245777113093331523048082863393028497800198798214162460468810255239805388327372581370876048854446570156305020156756122873232317422971971667782395625443316190705195200054199849881161972728965338485759581776952603792377687455358561401238930951508430390755546686425834559253741387004815943463383775316607167170332896161391138530371841475375959187647639010914589403859666685452272690778316575609107684441643476768775991125568116204776763415604821909396753842287554317188424499523951722190525065206594827951208871994383820303927943060724344741514500851885591110064055124341208863589309333105356248382795776523275648605692411415094400760611379409208473914897882803559704626790058164888776519666797451357846987949647032909933592425382483491765102715466191540329329671118324961083282567607659997995837364221086692338625500632669211289484048037727444436366646972943578126554425470996680332925794091765194609909292036666761264922074924416828654808568384887153047057535174415921850154083228229374465158449256780602963855398068260244031584497401746267823499796454766158230579764998758076373442396943855615320252541352217055935246542223108887099077340616040782274097021086444276961371649225009718353685662585230712910834847163226260773285918183713600795944773862607278515750100198398828559779181677951637888781907040356405064631093314048555954032018686185810657667249414295799596168402531439975909323302312113943152804944914240749332420566292700731260489225871246097079427427367811208708206346689796974545450567564820880753257924559839433675987312987285483727713062178913171788129462626727532290661671508415808693193095596200670538466889866036277890961003738304301802630594120114010396054874073408817174013003592696379007811868960229561250602390221857929941321823372234154089974432816218743067752041734521766758083480542999737790939702072775327710848963680827544885090303605599885885961472502699584577739516644064658208229546925333886645645798158498411721590454057405383495919967941962126892281332861336582832946363857244739684557005486685155229598567801190975121768362990766947120990918478926685779012447666390615836784336194586621595311877811265534346362761833047168123430345674757698400562588559514525326479162331947077783706491123868494560348393273310759524284464959507768485558098665192249073240823693338657685338002094045668101140677461079587855388608454714451549489968293870223055557974189697263389309579207897379332441754538724291293599689534567832802466041885046475057191444827233050264377418537827679605983366274029879904461404931454692645304219344144383153582664844204120298818459624251370975791655333425957315159279690071397451578403365649044825774115300425665083000714429676792339567081346570831805149512973303255103441196841062862388913761092261744266219919382841753391180247272350457173143855109052221377104443496034104020379601717100486646511947043388874254106020989777578249955926188295184424711208474165808366661267997555027875085999672747545663348844650669140591213297073808339265587581303776466370652148076924457366591180729190230579469620506353581749445319427694402532979754783103107814008708483953103276994959451746463354427228615626505497291586097002182434082222845573627106763996763682648438838983580037233043493769921458438738369577464558545905786555820956879427538394327856279593121183239694211056759466007720514503775495415029851740927412426247711132992906551948196584734758265088667519662860153229457664222114881512138299790651598521262855638986335850615130216087685677414474566800565959362310930924454221159484084490292453370485129679254984224538345809821462592742743089761253540059138287863518246917869725130251373458130121889004539796307363078250581473615511418686377606378345199760854906578730642335510687276949301834602193447166639398655524987651304788169066355280499288827619590755299522297820904947054083940845437035346761544397331301423783274353419022550567338008803643821982396105727673586311172399818674678159875356885188285793965987169500178574660140774424981800033271686313055233179574125041459213068954957521455462875724295035832083342704148812592598071143971432213674657229122888406724754499303660319920989023050936759375119192014890988779909043553242220859664685820773645230392677250612437597038190655525100221644694052512376857116502738706310704023317814218567564153793410640924305249128106553209860772426219621365736593681747381406642635992637454444046163817101110422964457889826481321172539620016406010752695085872897015897960326620615034665953798502065264127156170631311115183794118272388912583718016964942070148108784341799434655560401258959727525717618538642835905124148651038722235756189363977841063220657155670267602345864038293280292286080988979684210487284559212956854338763747563271974766543781642704011754920835829676775061773431067454649286382567878930864157165702890854956054988926600453238548128397781979299459172285286843401926304183030271069087386760965077354171659489527844354520912947919730801685188933390104204910230172002659126292783329335413380229029130846073712577558730936513613688725414647472620442399795590484693439353523710359606720338332334986814429929511583278643564672504659073969277205908640065559833701817206693848382389592242888460199849196823924592924080122878383086978081507822281946643971407885437063104620247395468842074536873424627562938085476573113250390043028371408939630886539059089653074336499983996477149180341958816776510808494900526085906539279979754177133169208297162783753732549116228574387086678462437209241292032410269899992182459333782778611315549528731074263980281353124970429327324979603024441714678367191374353538957318015172387747552603031363648967202338835399500796231239024133751152515480144147856927779401060211981314460775184812606788912534996608656260005474025909015676142825807097614289938782154461497597628831239470049224519446094456742318012819509498062506844728884113640155107157935251511053433305426029289512268542863399750965691041223773229541574113263359464376035183364133684944338102137347775349710792353154013083061203242629778511532058072675439971698782432726360921999211193869773867675378365571974838473249225109050597246510631507886278298262323391645172542159167282401437722779607667703871650639078468724136316707380842820865127777789362744315613736855337957751382267593674672606814821382503952294658488709759943523891715044288076524527247648769619832909408758274863268784140315459825169480655169287293927204547344937009059001782400661655356047683346638020236124550185872416130886796966355278228974171297723653089722493506608361097320863262269482274105080979882277854819612404683413106514194897646643945469810197504238294258056620921291657313382559776270462921560779244528729690973842062217883413734820492266730971734762745849908963624278711088367279932078169884649712768931688927855435666787213430136660808698411707628071021920011749887016786517529913657408594017965412747258507593820802235935444894333927550397267908447064352695047986022674576825815881757840824953747396579828818075933054090406169877055549298648029871580722597137040501997810131363846360790443050016689578612400658702848438522629915373725586937713131863778123362240713791173783558837247491553895431589532702571967428390816378068025782620087717339932391532776214361065832512303958547640218501429090670919035025343371724309582734072513207232882710841681302722555034724508175935546336950153177274744697330066741686483121048518822314935571425567115327948748387669956013813892610642774461941890925336866846266615132740842053177925829122822696168415636328354968270607251538034113947012172689413807554233727505141094520632187125163680640415800484012286736868117826844395285623641611423577886429266159336033955591262707155479234423541959013345951537394495984407594705205089918046329693690693717911588478121330157804009748568931896711845768178434856708602426701714496417292535457536211522348824670881057794974006269385156459871028259851336277245544920529732958075264208298482014198334706870591739564986841934730186456789590263533446197454344881879743132228262975741006041524997561615201725444702963599318204435349593410570000909408201503131097094563371720906107458165070621721861571295698150621260341934673752698308108466221321196348698062691578280194494223108636687546150322954368174040013559115427151134614445218162439456207888225239660067032417002287477837356318627086356225464057988700151727076932212192481952636132238159582422800663365790717223174864000054377488833462888582168005372365910943215270647822660290027110450897422794575973146256923391192145229232469736147507752393209750257544417400258942051738750092398033225193291934751266868402491367380126420158943767762799792235007161756794192975427345701510590966711033967207569648629350342911938486007960885136860810868235643211228044107091242263999832073798939102591836780966474050542015454396807684754898000388406514541790293105890991385715965526106130533352305252778835353763944491627270336150179051241851307750416498863554363298961541171945606891248674938376498331760995655704846959747052622249946983733512418381055251623379898664253859311646485643437307154737383554232049096509238678501116966800539048431009795719943554380805758663674473274223021901866316764477640713589056141313214433308819497648440783607087546218193989239695474512571547677679117807304589352623732244382593255132418953246666729877357014602624238591126545971934850859718709799739656014595018620332097313664952157771644400851398880696274263838467144831479376186294274909999602391281232520565645446186451978255992845128229077406774178590223070167230875339937585067814095577456598501978417262197261887561343791161768137074223871382341449165924359330436381488709776266090187676912763843615462590022673138840762574822689623638359249377453410209558668359558534651293032902592068308975260365755263906760291997626749597497462703347221651442153135192648226878756484677903792166835952558030068511198067942168054801316234421653344116823031910640803255976315850300357011426881913133365861371607072746234174947458282039824192982798085814628247246160047477627748455804527079462977228671300690596644881666504809208744383021659884316611086668701341680967916924872540204468250173960174300925794833816243426995061572165896338632143688299394060945224174084535746099509759345775243473157776428127290692607927927679900221675635256835329558391425803020985293714151434910420932686127443356789701902740645866336480724311017817482229533392976784691724914267058251189057007832800559576419565179339873016833044271276444933049092776021823031403025802320604837606129755405027395681711741022800402909264176001874077841686142496230162594559107707501874361904123427171684434769910359818411416794948761916952912187273823679237968197816064817304101018532983672122138791993731542915228201720817701616787880880468122804290799598550119887285094746244891630937050120243484971141607577274834521261643553436563062078478201006625958926071826775820264611863337341579308617352859621914133542230059411802421212519789829049133862360592173682232152963003490613537372428841916444188902992074068045270785121257889599186998751252929613863023090902642949050074368525930514760983760776635156263896156879931979835290326049719908564224026378551353339591589669441077257833705148907666950643094993432768128290955446260573819237314815475243796323809610504666148639913632010909007981186210852005937708090108003244353868755822386498038634446311110907086308110526723001239365242022796210219751859507756570661237314076173685667368553703622924479156445598659404044864526756703585591822465216454546436539505390440367059166957821742456695955567758738054727727679355858540957138451575078376581119187714053805200040065892112738117865909406686269581124676291593746963602213082212324339101986640837002380544707788349075933701652207193966428511411834779110885816348388233990261041370194687889555392068340483775068586430149899849342346863836473487349964861831257427022461542070051485196377097766292503266366292383968030243933156095573525016332873019319622292100679535717809695183781639175336769921808352336512136245392439281169639233542706635344047146639103575645287428049948094101193888951141378505705259782341541813023892694955348013537090170962654256732292937273620291197968691720382141778618576244797530549068069524673046248995989081691904079689581372681285708143090378178113541141278908172197359790154834605408410026722154560893904326264405611040579734688994818519570856332431240155176945497512349373245787204438191991156947907847978115972631580914441134487551972910323265601114386778433507018942444124578032064246603705314245924418877086593841331186401782458545829803156132346991854960424540847896360944342667434102159920947571444821400889475394904616168675081902057822087473626913206065452681141074573536328795475107589209651359798359005221138102836618680374310687783064972361784051495286146300813641412551814460774100164072732037666628849045873810672373068891632601294584432239268825048956404845868291157542033172737680446905614306440973507339362582669004011808779625488104501603249045470456569120085721975012938739376154973945500401539732242595382786494187212860315722500802093795539860153910883894461521248082490831208546160607905054293542604312009365549156677009586882937802366454614999037841419544983438343290818941778210895243618443068746552537816345452093821204892969236776751332742413506734922606438045574716330796767651308120446311141698354851523913595114885792383812413588294866705646428713057673950607002118192351392433596655285927016297617832365251814607827154711981641229378278638554423836502441493737195711757744258251971697434535762302212122425366448702008261632187486223302637827706241264934825509491495269430263881415972921875463178416791871746597040011480890258799321507159301028524319101343240987963920633257517944518106551656364949433074038870753406472536031128870826387941271821233553717583052769057083305074724457949262433965737362930922284585785114452926264681778853840200974445151325324363508556951410826256125263252730085730142643242452980314972575703605037969033554927143040041521754909748528103450444202960397048801422198007146663114482813576825082916277048888547847795157946339020805079805860524815161247507139004262889536078694532960726163764892171936577248783503073036314035559031383782479478502860356949587868605561410335649471641527376463289069818499396187604815185858786046411969689385405231093297046792818433177628177033586936369344041271330354861170450163918814251074527949916259546427739413869945669041958686286934260362673394840297049389416666129140663446992437966418948285286209428991953587639917971543840762911181640237907920356696804843603260199592394288253196264506811627042912017867928549250968492610414434590365420608470686746315364977021247178506988186943176783840960634232111650451909303934875272945306457061961812121269159021497491449696226599463745018815878740825786036893926174790006148819752788353863041350378459615624401050135996781079406529015226549280469245246813120217366005008924250387753748845268346936690867196935522292364272158074233957532155327937878566130701051476636380773345802542994898758548003721890991193816007778804570205083479162805068311266934016491417757961067649397311227878226559801752818260633964080218567403748294759372135181456980793077708925965600938060948704780117771975174652707766556949825037110463843443091341972341586573368920729485305536499377270455909031713927254108673713767147984546370348346233403082750168364528550213449027567955432506727351792261379194424066916317409395717908976842573851047118330505923918879882305647665061418185643581722188987236899706033814588821106658742132061112966835855758062631658322790124990915392742607286661338884454220443729796818369879572402854519136699219740602369077980630694099252274754589121993880959077475938740690491366462766901196103718718284499893193094487774948334206519326987037392846696137866971346407004208751264369964136123834188690437878690726310818468568646867037804861871345896064274505123492555249475300190841982729178173198188992767569938535378423103810322818968647693287970980064115463918290633021992708749514702994780738457028997578294045457415423858887181268888199531240570911357024093246737067353547254239172672370314238758612857502230221436290569637815915796670205487176034356547238339810308072541901523388625959667366486607948181694175750040104222121088790794922989221856540004494310362940077989825035583684571653714578723404460833699447850636024448674674998789106241855889314071677425069116562089765636103446599097983045812762100976600399799398825270975736157201012848288568361446395037327872770940332296713911219720160323572279413161769161584310635325742629434313432037960092229081537270649631704085328368923754096957785530333836207102150847465728722795628349217880111551950633968790089895358062193452658884942317032773774411602611234207107847905670471591000253976990043782383654284536614019398114000495371122079101480490880881885329718435956453483014749357711147614218559542337538059563601654176523044947639574400877646551012469045876383045513436702036425511237305661505205089043912790914164428611987171477409767300079593860120342997505689915002781530138520044874041063660485984410610973034943768664043016896194070479728470365873818137595323143899805052942263402692784608455274915238363405675526784791933082001606020629445637813818242973705666091678160993582301951270890373307804736503056305198798992498795786498645339578864903392106138438102063672970126331922403392325894974742609983548157487438900277668713010988565261724000777444722348762015177699672075332215653875880723533682725656480842447731568034354424593176588321683159995024052786761525055060690272480793815838869298965320818186581764801119452128260398441811879371797540036933045671021516720094708551632212354537088165000127391672881228640994826658271019889501151000572892790045769288536098716636701623067773835121943496467275152860327661634496913956214136135867580656065387346629515191732623130210394636417571684722302085063715884834856830037348492759325716021079547976591932458857230426393445627416678329633032232500568850300999306321916771362577692832615208744177084827539543426594578858622382477365625917864663813144317384558160273874021494474288475094796688986760481875652515259435837297593029168553142207815819741623766048452817417400992448329579532678248957729938685969195686012438653113251829188805709093720317725002878302060334174286206795202263413213265741041842583536092274455003082700174958576474745211617220305738283902443693268320848454225175111441054654232976368916868436415843234286640291290642310419675993709763285438153229585767547727235613557897027382224151096388729325231252591939680186449983794893692647536371233304201471072386132993321893894488640321966861481244906260264075030331937363461846694648735888810948773419196073987319693724574155626141897043522036124040689158747236767439897353265842489207294831169705121441921813305979051330662766127014201191864037131132817263147941978119561042624967548089387733906214985188427174673427010586574195485895087901252627306278878494820653753497969919327394690956934760632540553682196911028910635932069130566109137217950203925082632570407485780453413104941384980257854072146885471712971199925057222721895543236321172000344121388442046332263603220762573817123006796242601054619776305860340202853972621388961223175290545388139602288597323524811691812909788384311348417394108852775293934445713879313464307150217209226308849672389588048059735715824537007721702946248793235457306625751735624922160660795842385275996462087987293768885333184364272255299313910543248036452755229284133607241356023312090887256852597559024327756276155724868975948601536639761715159009143372663459105595164935883709445413252514826169541789599812286283630232842351391049511627791620217799286358875497752887743458831297976623247335725050630918407717749547673968383640822860576609678760550406362449872813644326238026177214105165480258590208827130418385962570946227443679442443159301562605855892444253381431607775929847205528100389248809487789070732079823918198448641662629661383296709315906702735906925631140449559209814426571044032150116102871349422309805976069948389165709513537224545128057053595811881564275481890581299427232855428835062790058788589700714055974272085556064249267096070579960612097153355028222973471061414756543941291671346126562195411234603288082072751825821340410436795834272847296079535049262386400273967617444431831004232624843493274808002246908557246268645910761588247426492072699799171977190929199310313548216208609032926253317283145093191518549271827655192075211124566733652406028227576897917785444950849806137854399076062121693449304685477281918143432581965173675338915932935770701900613812535825263450980402029878091692219781687730254506964775778860290494265704685634367293562726351686876347288489896682916262041688344671618271126396530822413446422093619571015305895814902249540821051506361497820619342988706908646117864129897528616614326893735226645495784226755036851934344312134291550639400316500856352630573796023504000212991815390645083491568697681460986642943669804750294731044989208810546587241817992825673545434170189775511937432996772616523742690118387252738804182758142891409622282322458105288460963457642907264864885091424205999762113889272204616833470723931391621095542798513524853453416605579910622673911187228136366776268017023392321031069460236815422723129597347293261763810479230155849038460789084256885788841759833824875481128805431457545942267085228207319908518395653003668066097438257262855304681013249532934889305913723708144941832974253055864975394502710747245891967922202785588500711370874080417181349977749173852277356874929417539705713245280980044416043469917851463852779019277372399580735451113674419221421452206247365170154223966345126448226437877757202633889697250033933104813161542074233775943399772164668367206652487109456694210069470265405731342402788478294779650449523413923331085397187677752715309450856954697676603977188287094950216668479949935908408179223906909647200905892129283989460132758289678648397075296118584536570944104019608930968481694203064359893237380594316033396462693421672818695898651226382308750811477121940853240348544242120420725507558235167440750502324193067181697138178043133260581385529835237541511597354185523392882112553804616961024984757851912022400031104567758873381150354242770162319695279149771412723537632968131988110547857765106213680583783492229504472569575707791424210521173376724806352467226537723849822899929327290482321600983833922630076672240781575653541767455659697832318068903663583900011527598070524676881182913536148065240183665408250519695154124248004572529071229412211996522356317279290567555359271761008065225351131326585030901373015361182055600298322336472119743615992586430655898213546067314996260682297847987265265672621955549521873071343616646346132693720795027825621730149379698760920356065366329503859050267632316822180343941535788668814356402883511554327289339780436774972014833803811320092706080305882696484750115824953768020954069034800256229374071902249181376004637324247284769842391145618900537843689834606004492790933525084810278845445758203194285041275266285331776542962995601378948556064648252078227922442749947560244326362582783085774230166372753611204852687185909536547483475947509912436713317320036347879673467596517497483941742910601360508250436961887473158838236602296277672578778483430032556094657810394941424955673296379609145737518598732084464719415912829019591541455625450873575843388031063485226906949668338328152934233563586331373074392045938834729398815675257271945962061525762584185662813482868165409951343036672654370442818797916675053282700753572997275447250075848948048471032463722596751140918728270596965084747358597944524815016323022854042706443122287453820464653341626639061101074124754864258627394736487059034818978653080608917070325450673880614719296405962138255010646925087200748289594094405903355857244475249744236921820339633615378986710492148248766141088233069756120901107732415498424481381908531525783575094624592082650084742928153378396042530789774466429275510299713092573876544241308514094541926173074654041135606603305344864796955982947196823193433824535925519707845153195745624666824740643586975245113911284383429841641213090422455987278716728845514758933331325926641441707759124493167160252584547177815138126114479347302865595654067434849075901072703151567674780313661688995197405359534563680135089710934187381025059814840902444768518635843644437157078862049887552600143534133320764753780636128260976524784383230707827551498413925608511838286860089700983843480955552979186490030582176054718211441764560359610010613083459547404847295436023403165314603611136589663808724924650881483308161266796338234374865695213394718425724255387947896674854185454601439393069757821642165740145902230622205271373940923743647300878603284641802898073230110176391580293898706293427597251284460639523126214705709071853188921313876003783619280104664515218970862588967138598500163430270191674146698613148673703357187083634715718179241526604184408227369495563797384123573695751125313525516169746445643308768674920117253055006579739156193146498169958344166074772071255346391166601971133267433284368217628042760900640822842308701426082726307952244018383941747256238267891669869313250498140273847812953736656497922913833360913187200457928232714746661437789801224748059521377956044031201092578347774673228623543217330192249195990642643235178665371567702042800883728631599679004430117024643553308408645196731410123734369351446645065183748835314524022171496357634563960027406759415567704317097665595044364925421952472858771694818664484293792454957763602173219103915401351803642875789753620616327943322518767272639960869658241588048034680955028610768677247795855927937791239920121052446600601330256651866262517522122010720794142761864143868088998096480588918358451337190664948427394889427635553937458457449238912218278511401412766881958501610730626909720337406491598235948057072602207548484174139282872660643644473419083237814344064670828822800022535583578013662028157866660929313694833320554051097870663170167263358922101408756430191577198373406355519578193239171081123310161626882470307405087441428757501989819219162299083600549055352237710927610022972808480029719469458508982865350975281857097466134723386105070283819980031139384069710664469273577909410245059550784179757925341291458291234738746885260144156401181243960832634175509616399387259490099904041970907890591089236575610182312134124706497573219440440012299168867906305685512738329447148519729973648884160431608072021521406617209817759959192551392062689373817685936959137375234544176687272151530549535419406953455956498728315646297502627887878964060622680807934662253627198218556269532970086411239286039164863076290066082588073174833918694588424791351816549405134332757927764634395541576914655683461940160273548486775918658358784091264304526171763408767467742366600050036322111864047718751274592638629219504867949139260816516637462909956765353985988989875048023616142823325266229335298292571569641324842221299447504157493314461543682593061584234116711013433345385195934578470679583192389405874433465765276737418182013242762991274844211947073552192058898414502983529115060990839337452653727365704997627944208981178606786838647648914617095364438382422869929028935020853767622107433737154888403147833029352172193336135873051406376247144256683084921530617220312258434746309601540437888757079666074346381572996443878425588819475909875568805497588485542950361603928253359009609304398146828621633625801164390686880088832527936547677301368154972654175557873248997968601333414535512261335825291962169429892613220610165181816779095602649673936037476559834950617643621111658792835938467037793099387780805034984039491111976235496092304478303114928919896930970034395756564372413658385249765351127386734793264984061520467312316184149653097825987250896466880151116457569142673928240648481082031274490621303743914012465821913889548420665150681924398965802207748074105303952011342574406195648951124784158406154991708064979224556858622793739568559098652965819094860492289046829602420874643871875276854740333574432665867718025470994389139757317082660593684718871361913768519018410452797371861408253731026841731474309993234795883729084275980610976037342180842663558167412571782356241508084264547289532789434981957160751701566590790236460302285688713621226165319405735114300969267044067841183886418929836416892362076825113555387529351745922158972557473841481017479934923376592420505819525433726718699281252353460993180497981346748520487565703195158232041689293901608465486448464567032640081089059552154886107196308446042230796264537669221911362669708353136490318070347196123055461816905431121699292837882030042124460711502072994009231532273602252305761843996895298158277617387476014017364307467102364566740968873392506832931288703564816842884654375542037972968808918950143760622106542425235906984728403045492889073099239617365198318777291694709518845219698397303174882654026485959508037678470031235380840623448591370339574444518840248471449817374593615746835149766115381014707401456310669498977919547971155976004765010589188126136462338548768722024382520053659441506132254307133374878185999134445357833628285097410472877346254230703449072497799306562032770667229527204580479638862229456918736597186086948024551741322752805775148483994390456804296144220222589408349941330519064908829967016392901011233918257498008906680136426401564175701821717016676764169728975447761918170059317331159658850429721310735525436100345296000645841447075579900401489401584993479840777020524291902868328912168907187502094247602885630979434085344985275399368621056146335225905350560889484068793328592400156582626254151308060147331318876733034013614156316891084012846014269733538378626027567438068302286709491474654127550043102976971064171698122500416983794002209657301253170192246093891637091318546486519883752947674420229973811578875383716000978371674512392503808232508777241146416941930565724768264992999937742988378368190072326674812775535405576768034826768762233875352968826430342272249333186808112082056491943994757293625851940128445984832585170201526250602391681611516294712950343419522160028243155501395579425455413865750631976659054804155992007492282832122564958614928252848358250786216022593715219948500232659100050097519158872878079366605037241147850238562487632653342287916975793993050448487663359845378819316616924141533030314120006005426004427547331597434355492509510133208758581951395100626556138437525370810579869450089461102983655052987241810151936465088909165126293507405327058179362957700802384454386002331482130014962245066347367538923380751946863542191114925146832579427716890854978726769464192957006693630115985202647783604150183379728185005023867555653124044398659898936608257114312019396915585705646919268573091885235816196796302506247371683913362562425705822035547498789202870411687037553232297118425708095197109112589738347664805385029388633543601151153154642900979542903072426258652020269238222520551949334354799556385854305766852997187032896368963245199045029749354472990245464477571814893946051632114907503675937952095072096268054532902862704126271783873777838078516036480602488648637186631719543187136921238027252540711689434977979196744649576541011947873895041643583471307876118593234006966289348980997534308661407307517183394106413664526896749571743194787126386251170986824381253095427547705981609503603978670927872162836668157745969685514719600728297294185072547757134359449615323461605077406421930253642874477099554831822071224294899808498932288008820987532209115926285871769429745325449034004780903477586090680160115324810828213366078523255330494503217708992614350245842148884656008919377280067556993165832828960660380821362263471168700988184805851064880752388485597354048330892586298005573443561565779811044509228231989237608662042855342272527251445436368170227038359659797020719501547513709404937475376300913062804113864574508733984789289904311295462988577984811403340459308466704456863855653204307274301102656599581951201858157040115319691588491770783128557552411638142632031188831608956753309451318736091146535723291490898070927471393808294692305973005615631986139989677584579001843714006375053707165927831308027985163441760377032835373251094730455502297315947319439634081856579866877405393176136374357090042879063628888164679017860435790320319568539431240175644059704953184156715490470446917831686013100009417216204142080611852917644894109227417729065940519169012662800080103276472965175891418029984001405913632852413946079801380689900017448258120670268416624766974764879110883328192558721597178946884274685988162215891529055468585681362461396110877742281643869133804861682553363450911348566232137781354627190075765565323109988957587335915727840644293643602362161274736423232666994729301714129051247308888978785193250609034113754121935832438816477104399852163039919803982927472578862328174934738467888422275219918712585531672311349102391994189089810546316739429593993607168538021315307321246962919427343533464074660260144625631823806103448243849070157155950653719375909913157897180820320307935409951150532010391617104993214925920748302820271029542073386032966236414909620925661368731578319204279664444677449301047695312229469363548843576808230023986188744799294942169727405064455412358638084328397292866148849860914315207205550614302918884007238558927589487404407454363330888393598898538924387565195855885184377108062497162740238599850900495025716039847402562182432259812405769636743252914796591657689525588180112360184305909397286385827866092529409545327270711196102778566103379674816248603747235147473499534024928724237664562706628668157534189586223512969278212789065173728833761710064291428147467842830411521317730342151433418459577277037331954304256316250512505035858777705484783929824736242454485000493384187253457856972128661836868386557028294925144564310522478775703916603234327695703668122386065956438985619341736150769487846676467188674249567275265812324301484823377197099251526114098114651503873211994125919978143973282955510252741693178050188467976795230148922987347391189005532862626767712962198703425381845945594049696597256733871401530536885302905420692664865079509714683094188228803197948988159924548274516272688089184562545214037664425068428330056782659893280371677668826838786199636309985351935975411629916141080819118808720309250624945712671112695402358289180027440268841372951736682995341197902132213572259753596187794602341277298732091543035987074529800606132844295431101885835564806962024610272629328249869536423968217133927326587469587887213679890549716793712307471791817342375657791838385927596737639644207018401628511818466057850765861289954185737378227817188896039401544128035907968542197738051923785167828832751927448659287649802038532141922921646891081311291646232253867289539480446136294425378000270134873548092235457939771827286432386348011404506597678949490515985789180814288731125248389391671960779146247288394675829682648873751360051867637160287010817279290314023598153543663873981020129956089947578478984309845337374434794877555792753738842522260028215527004581569204100832800915568908062116177492255466633647114062568732103226914504900340669084064161475415440106444746452983854473069615665320829246412602670977026205891597612964887670884987575726242193534257622938884867746384952824350235588937340526677757452277459138209334245688229340316359233587558027565420758438007061723146480398593192336799686310896237434451446902345409654275707760832487817280298468600523869802542479888313224469513677097586359495474522844482680936369958282218762061083929438834472116670615150120695809945961017914184882842625993150250704838050769003588142913402870297793591703006996330535965670261126719232179071024776445106743342158185902319490168918271120989215547993558238811791772504062644081132318769277431993567461625102189873937802998389626712720439378846515935307761218771301238647468499744816363202872776735094270620629228824314568445484697081573583127225105733452499773943273819263799997448328170902968925575677551259469788566913794105305963498667567915966319953486635865299940786261545877339725435184290373197685051956213160289338264053179503886312531131456887140707285857774957124142101824460435879537921208975327015638426086392152569379983613682854190996876537176760979797077225337988836567125483448629130571883358977028332773140154503046947820456513194576754542979791646768055458081190404781723016623436742874028036500809786153566551746612558919539638812089399870980340499941456107504561939862397360806410884471147667253631361133523706855117842244354788827037158986317753793104000461315471649049381542647825276571558397543592720770304801478884130252472407878956320753233970160970659676496600280207823378537637313035613203854397175211782405613991796366769807778047807585144260193859523489790019140957929874088870432288555400924657021317748213481395874192702765825178949291058771312705436649163474157104972801539938590352165520214709882215120450145939823987028749435376689234854642258214922238414899726243380351400818231531414036587110881934325304467560148761609853886929268164001695506913408621430128563588584830618006071657949082233102804546281356408046888663337049999632885460755091059027211733086441703893659356032784118195747456870365978715308640586769575828198652198574796483316223468400240990918979556247833759169379664180453241534925758394624192072368272510818619083116582842770311443342211916109470239789859926096588209998262494575501809178966661481088496449599544233303491662794955025676729014965203627446955135346784916040290062675483896622704641757877503343459726576644781403948661366481900699874661481099013684929794928050397343559170119717347751606452088355698551123026851404981231845471322143228754694550532995633373729552883703748010116634748453411485776697019749758279258056461337758733405560203569401900950501532383791233835379699804547734778143335448785324936252937973213296148720775077347503186092752976553117637810201359326676224299070681833061311689483375794379594704737278566804137990050506294966350097476415092765260437507078580354417278020728423633462751270929023361941574621564882781801926511019597837222896699991840834578808163806603204668880458033878862174302727622219770993463652624769188174363607139647933133744613360707797655218126738758099830150858602143687170029828572636036855385968924311943584981609083779012819375157155755801979074946637620431500438741936642570434038014602039287833414630110191550744486934226892081163226055664028575414539960105647138899068051712423996756293174772934288439148206284557045558539980978024938772932958500718660984969902878599575852825854973611655455878566594646834548643965028418096865865271757280586092245979665184567291064287910753254483759581144664882431705340101968006468380579399834733250453367169776344669424902939724987958452728433393029679397315955934500175343288096100561316913496717628691431414172334234211040828106676725729972179439126467367995822531527074390894013021759246154968082342275477805892846372776092951063923476915304581513361149579383496365340211936226046882842987959566149747098032097236141213468550478943614546350390478095954239705512121644259307965138653789703755735239421019373765765465183629418585251072732966816768570197623439512575918870263247282579921254063400433975445645538588555896295870677621562505729844641897317041169537525978186211807420828671402543745719532877353459536198355172684349168803371001416109487938425366740780521712479465703031761144794372945642124582402820398718037370667506750976504709806971121297372928263754440789512011503944944758111840805908644338647215600803583229861363855811616017487950868917373542741612620636276585597757176734916066906401655439594115017787931562348133558671209871773430946330063705072710151884687744563260197476181435588797890061354245951457269784919686129165021910842989195617901826019208017906119196997654373785902679569568810129191011957002106735678670410216013514542914715385913318158619554706109394541128779759004931977371847453926507011978325677125882312913499017620365915675358339282067885108140473586985658099880226106594366162431761254093325214670966423224439211991024014610643175436566522547471420529475934544803035914984683507476502382767580165834066121061937164103794552508808243622807261894187770307894367766130682915111262803393039286779372649732787738093918285465094425414495637042508870539083069346627630131086017003602228831752607952348907753261173040445289599132300385208888666944381406963239365845272885896790024096299696406830295116762558369530691941449842241927840614426447948495073202402736049963281698176061603748950256414953770217403222503127901339745271513027237856828313010070215108560294283643520531244619973504085331049907044969007901496028658673287628604187281278045407098185200157192387050017657408165987261562062125844717263371188413474813672006605630506428610404273520763995957078626689606196344815958719907092839106214595938225654159110481931461135373610031611515174425130711999982063967513344031410247138187528714504867234663297787271689490994093495507387528709875565254812241029282980610065246558617364043718248413791402180086965979359879017395643926851918341356641973677001516120383608297617822489800980961060919325237329833766359606251284173919009070799700687958059485001332628559902283033755935716103320127849484042460642851639941629428253319675563146192582881793323062648341292600312538318257725351371210937870365706821374435019847621921933481380316457099641981707398230496300297424441525608470432161275488756704703817158396008725735912213049818662438751006235709823972177486630737364061313785624192309600862491507968225558010046577695960112516994537339918519115266847684330168371053170859765513368721690350093882084243833309531177937272466040965480721360412510349010266933440255564564294496592267081031576186614589860347477339957888307593691067342319226908268685123206623288280709220069448414800054166163466718555323313182950393738084373962890544465375923104717117892399812806615737074402302305617552297292963353161303950196155382498959615399564933156482751890094208908943414640958202080854737996550654244141103402480417081960859465901939234805543376790196848989906785927517589840921071481349008363934490023837731934114310551164837912582726787668425234183633321889654469208862056719395263952978964185509566332962337032968589541236818908631000673777963218809358714063278805765180739758223084594384260301575915174687918053147895537699858788330328173664592519273820226823012248225723474634964104804217518855358804585568804580627729900857698567942240795006640046437317603007597768512270084755556087828444240510226161140771363577461697838819726080302708211015881812331342455524766787434947611529811432803359135219438966124716092790631265801850494981022571149060570278716156448897935983120228619347434632783224321905655431621847669995531435210269068144357945710921936430314209205646593385739493933468635511364740251929934721603193457428889401905519338463715733065562411473723272486820495807863566834928584644169182147264252363435290186808487661659464146128980301063370508177132118560961522934383751673904498298907694732557967839730855392318323736512958786493761431279796665547659196693870166342079517841616274684936356045169253863921713514428583554075487812875106037201736386740365683203837535576382017391113201993417541615678870872139212454306787539420471520293476778766692409122639771884237371519201237722409727025084052728895802332267181078186860520932590751695714955512739038875393912313489701789031953037620179168477072930137294312724565839525196277287275677014476396345180284274393466274785778289730977137710218821864304652334298569244832594516317704315870254546013912268829416192099127502714903135214912204257914533558402038838985360350513470459888236951109876335991359818452229635469547612741143109180436717201080263210376078691661862877248713156795416414032761874189000333186471370512178773862389397720111825330533357010386239114938912165869073227642720053609397968987528461503211386825875376608191503721248248671943667374863211666570119718820780004325979519994067368582557797005986082839944437272732138336412428983729348775572096124251438062263323154152944451246700873684816436840377002164627855813095791327641496176892013382198972389127907767914746738533599707451507073346384567562754016017170395568236963901668562495199358439846724269418540288849793526117183523026318218010389841454624664690064160025451199123205384138837896622369506492470071946376500537253003680485441319870026950411618451520254874663916995344626236039184925253486163328813080842096591878021479015116113288393972148434548523515004613711641345715643341898115799751905600676038904876244023874214740683981808247369614295545329611210262834367357308693065965112823196460504581530273474467214558021853576203322121895574061557664763535789404359169494274545275615998981169464085347662915903312797527884960017183407736357319649862756477048267246897261370341329594132629241076295396468607281102898815825486487035120094169772714089182124379023511818969500516783242764051418454361287621222181643940382406850305860802149041410385661998985256855276793118118844251215826260370785035770215498850009262338243251298164705387240669640347898515365895733534064828443517170655916329371344099036003552062620938894696577232030732933820466655204753225352311747117501022258178185010189214552103364702840797668919468423705043757657162911689871594440255792970242588388725046619568032659056815947801484042084443538960427900378598683198850768214735101404893298590498897856396936066578357127254391677296883056848303910761633813497504147990388985072163577069167146437473426981034000113905688020156269518025843088585557827251075361839056125320988039412592189559802642291777500917843430836801044310939091385888682679188563287329274436237585527716020157925680412057319214274146364271703357755687404250119073901795306273515912749696851165357381228460204304167451596403998246758141298592452456474443615739959590586319252039781538036472857887255325274853746750783176381690260400559266076847509734405603012274169515222277006244401746950401915216419693984187889144193979605051719084858265151927285641992384426473208130087123909534599002367130361580374882928489661241608782724143058477778412832445734163579445117298666648468286901171157490824917086041581751212822066513819829038939670371770681896904433158540016247160904479363928402655951185968183742049764966793473675794144405132200701770581067986187514551914006785954543476836009214870528068424569547288340406583036204753446578599751805913467480626438204977871895294141886308087230733762778261546515720686089637038109508703576490059978170129568194306903319794472525782916494515257010605620618133327069155817105042774800231544886675181922348693827549187179716389180784210659064338132788162944601338043172872683824026996618112250050456154640179521642099080075204992604358709905933631022509971647364313792390093872113448669144479094634155679471784014322708076100446757255811640543063088725050294955022257079362379380359558639573790450323747179415802326936313970800288535687910788656915646899997736462426388045541636617913978203674054526397683115538133979441723496920069243091364654044250772332063662728450910072571340928957019730352847865801745456067909687805671001291908949046105253902893166836046247187138144333951139917963251647789726671719951738390951233914907597344733400537237374760868148364312534463662640745799445667252448189047125853800707323679445597338273911822038844606111683487851608316732173828250744653776070620609495593076373366842344900641611649701887098886464772803964619032638140038372453701574393163069786234221678617950202047992878623532130153243131184825150032914596174409816090373635510282370146066234502494498232645720242105437361160959756136613792240855260677520336494152877017438890298424501163847167010157986253066516148748554201210831998785911499217995692402763888628237247511414145605746399544052371313467695430542463372353534463992852766587209282058505727109835173760347940365887566619618408993100292431642329632395714017478618113702077317145693792941176365014479014750931555966102784534174514330875181364103284424008764610394548303362177247798590145399920364046464713240305263405832964383827286363922930821479969434811969700461831324381134765283967003775963574630759470588403557102124045281228906829790020533819075304529928264511389208943885570281280753142163404290176674255522453425234021618272048788880279650440807569594492695013286469954610478348480315104026184312276381249337940658933654302628623977084631550663147153039049864020352794890086945036212372843832937993271639369580663342336163402149115007966534348271510146390190979197078416156536571517307085185346532722064790558123348342861201592144993666394418843133979861155882561501251056564007553802559968691354299556572710480822189050993920554838517258684362648779701537821148568808333822860018790837036217231942615397688036366755362914165793439830198529839666971848243304020260311311130586122257316090940683295916365660952746386742777848822805491765795167749793480871746648189049577855925895150264908006822712412377287637208752228009111674346812520679688248916958148545763486063179687955223429613667101819827338640416435455328063684682317509144680795193619913674241848843161800877083649407043389454548344564404899155285424841029451223113462635816237249821387310324730862540361473719713382429128125944882606318290640171943985324180220058156036707798145830474452479625213758961889662721982614355094887538173199479857502913487624094325609353504459660265427234006957778210617756454940064574253944403218186272434666576648163628993275371676203773998707575632566709247361756744313886740025118602161744311278201302202590308421201871987850331739190939810026620888828320976362346581185528005946429201932883638636098569042750039307456450490723778169758237931324413907814972020479841443452391203187623493160019492624791236503493382535169048923491998395706149070849263303618781129028861342672062073819954330157167790428246522950605198446500957274085892922148177346937479175143535500449706969302399925317199385939648838076758858341595644678844964665019013572520998559600872406126652839838536606580601227520522737149222447787720460503221755885328034166029256521521338139791621031444232970726009292046666737562508900882174994563203729643113848079626428482697477627933528782853194645820420131205730430843747159327474905319238955483523122347419868415160859811093570966935434980158428372375633396081152332430440360207867368256758163454836034179780909275347147279081655773619888044596607539241993778520807207602422542179625881926009586648785166107476598881790643595488615051785336967485705800344694295344605450895377295574423161887490912578460552363626470312654634475548940358231055472243168441217355869803458347215078672093958873930998154961237229719075897053513625756129960402988553790919304605854116507892131487938814207003552600673252186494827588209195808322307452037885128631910361"
actual := BytesToIntString(b)
if actual != expected {
t.Fatalf("expected: %s, got: %s", expected, actual)
}
b2 := IntStringToBytes(expected)
if !reflect.DeepEqual(b, b2) {
t.Fatalf("round trip failed")
}
}
func TestRemoveWhitespace(t *testing.T) {
s := "\naaa bbb ccc\nddd "
expected := "aaabbbcccddd"
actual := RemoveWhitespace(s)
if actual != expected {
t.Fatalf("expected %s, actual: %s", expected, actual)
}
}