From 55d8d53aa406fe14f9e6b0c25bba199998a4d11f Mon Sep 17 00:00:00 2001 From: Peter Kurfer Date: Mon, 17 Apr 2023 15:35:15 +0200 Subject: [PATCH] feat(fider): basic setup --- infrastructure/lb.tf | 15 +- k8s/configure_cluster.yaml | 1 + k8s/inventory/group_vars/all.yml | 1395 +++++++++-------- k8s/roles/fider/files/config/base.env | 21 + k8s/roles/fider/files/kustomization.yaml | 18 + .../fider/files/resources/deployment.yaml | 34 + k8s/roles/fider/files/resources/ingress.yaml | 47 + k8s/roles/fider/files/resources/service.yaml | 12 + k8s/roles/fider/tasks/main.yml | 45 + k8s/roles/gitea/tasks/main.yml | 11 - k8s/roles/k3s/master/files/traefik.yaml | 2 + 11 files changed, 897 insertions(+), 704 deletions(-) create mode 100644 k8s/roles/fider/files/config/base.env create mode 100644 k8s/roles/fider/files/kustomization.yaml create mode 100644 k8s/roles/fider/files/resources/deployment.yaml create mode 100644 k8s/roles/fider/files/resources/ingress.yaml create mode 100644 k8s/roles/fider/files/resources/service.yaml create mode 100644 k8s/roles/fider/tasks/main.yml diff --git a/infrastructure/lb.tf b/infrastructure/lb.tf index 826ea5d..54b7905 100644 --- a/infrastructure/lb.tf +++ b/infrastructure/lb.tf @@ -17,9 +17,16 @@ resource "hcloud_load_balancer_target" "k8s_lb_target" { use_private_ip = true } -resource "hcloud_managed_certificate" "icb4dc0de_wildcard" { - name = "icb4dc0.de-wildcard" - domain_names = ["*.icb4dc0.de", "icb4dc0.de"] +resource "hcloud_managed_certificate" "icb4dc0de_20230417_001" { + name = "icb4dc0de_20230417_001" + domain_names = [ + "icb4dc0.de", + "*.icb4dc0.de", + "*.inetmock.icb4dc0.de", + "*.buildr.icb4dc0.de", + "*.prskr.icb4dc0.de", + "*.fider.icb4dc0.de", + ] labels = { } } @@ -50,7 +57,7 @@ resource "hcloud_load_balancer_service" "k8s_lb_svc_https" { http { redirect_http = true certificates = [ - hcloud_managed_certificate.icb4dc0de_wildcard.id + hcloud_managed_certificate.icb4dc0de_20230417_001.id ] } } diff --git a/k8s/configure_cluster.yaml b/k8s/configure_cluster.yaml index dd629d4..b2ff2ca 100644 --- a/k8s/configure_cluster.yaml +++ b/k8s/configure_cluster.yaml @@ -8,3 +8,4 @@ - role: minio - role: gitea - role: drone + - role: fider diff --git a/k8s/inventory/group_vars/all.yml b/k8s/inventory/group_vars/all.yml index 615724c..56207ee 100644 --- a/k8s/inventory/group_vars/all.yml +++ b/k8s/inventory/group_vars/all.yml @@ -1,690 +1,707 @@ $ANSIBLE_VAULT;1.1;AES256 -64336439656634356361616130643732656631373765303664656231366535656362383931336163 -6266326238653161316535663037653230626433656332350a376337373930353466333739636130 -35396331633231373730323737653039623064366465373764326161623337393765363838353263 -3962666265336364620a316564386136633939653435336363316231333632333962663866326637 -33623339633063343638653732613536333733393435313934613534636235653832323364373861 -61326361356231303264303136313332313330303636343236626430653939633535313963396335 -32616663353365616330336565336635323961666463613031623539653635383763643930636633 -63343934626631303433336666653039613261623465383635306332636135373234343662363636 -31623039643361393235373833346337623136653635646332353833386232656237323665636137 -38626261633564373361333831323866363365373564646537653532656431653863393733313761 -65393939663661343030353534343631373631383066663764346537393633643838306131333666 -37396137666131623439646262636463346531336262336566303735333234303464306233373763 -33343330613238633963633464393062656135663766373161613638663638663837333563363635 -30343731373664313866373034663030346639376339333832363430663062316339316131653163 -30656663373237633436663637616437613665656565346133643731313564363839306263623230 -37343763656361313039666236653836376664333535623730313039663033636232386163636431 -37363166323362363361326330626130633062633835386464623338313130623666333436376363 -38353736633130343833373636333830393937343933636664653436306630313334643464346134 -63636665646434626561386161623063373766353838633931386361306335633731656136613033 -39643930613037326364303964643332383932616363656661356637386136363631373962643161 -32383733623230336537336435393966363134383462323235356335643137303361333563323837 -65653263316665316163386462633533336335356463623539646539633436663361306665366661 -38626361313563356334616639326664366431323939393334323863643337363661393865373035 -30373631666363346632623336353862643432366539313039343136636264376266626137366230 -66363765393662343735626231326439386231643830373064356162356437393332623436303136 -30623034643839666234626237656230613737653433366137623637323563623638343438626135 -35653433373536323431326365333134336563646464383135306230373330663162326666373266 -34346136303933313732383437333435303138356230323465363933653733633639373534333038 -38623365353530643338326665396361396230663563396234306435653862303666653161303436 -38613137653738306333656465333332653766386135366431343932613232383335316366313638 -38383965383262633437636639653336353066666136396366653963313466333731653330313039 -61326361373064393731366639386335396461313033396461383233306266303061633830333834 -31663233373339616131353634303835646237653130393237333431386130396232643935646334 -36373264376334383139643731363637313033626138303633613334303864353265633031616463 -65396434636238623033373234646463323566653939383335653765623430643035373261313362 -39373764616565643139356131666437663962626466336133346438333630313338623437613238 -37613165353463316630383835336265383966343036346465653535613866376439653333616637 -64613766373338346230643962613731303036373236323065656665613463336265333161333663 -63386130313431656238303231356363386463343839326563636566666331393437373639383631 -38343035393930353963663038393166333966366634656466373436346361626661626434303230 -39326163333636376431363962363166643138393031653665633661646431613731626235643232 -39623365396365653565346263393164363865613362323133303332373237326263343264303665 -64343539363231626131623730636430303865313135633634666636353433396533313232306563 -30316436366632623662643731323437643162333164373961326464313461313864646661626239 -30636135306363386563633339633666663437653562383037386466363538346134373339633537 -36363038633166353563396432383138316566356361343134306363343961343266333031323932 -62383535346236306265346562323830366439353034356333663630633432396536336439376238 -64343530656130653630393138313665643763326566663165306665303766323165653263376233 -39626665643963313630316237666230336337333833363433313163306339343135383133633037 -32303234656436313936303565373138623762643733356666636132353038643763336132383333 -35343066333966323936376533643935616135646363356465623132366631343665396164623765 -65313761393833656138383636323536633538373338663764616164353066663962376236316538 -32396639363564323935633664376535643564616163373435313238653261343162623833386632 -39626331656430363937666263383833313630623536636463623434343461333565373133333739 -34336333323839633336323765323265653666396133333236626238323036633832323566653336 -61626132383132313230646135663038343234313631666232366239363063326330623936366437 -33356132343666613666653938376162363439626334623335303130613438613034336266626261 -35353066303535386264346262616166623861313661383061313165313636326636646564393638 -61316132656637663631343362363465653035376630393834313564383064633262346361626363 -38303264363262363833333466366365323536666565666263386131323863333363333132343332 -38383136313966343766653363353934653635393134666636373762376464396339393235336630 -33323839646636643632663664313366646663366135656264343031646266373331613533383632 -65666634326439643061363137346533303163326630343239333765613033623861623464343531 -36356261386133333635303033336466376666333434666336376664386164333163323133393131 -32616632396430333137323832643934326132646165306563633163316137373833373465333938 -38376435663162623132646336353236363936303862616234663132313262393863333166303264 -36343263336134303835356130633133616330613334626362386264313437373131376433306234 -62323331356332653062333364643630323866313139653764386232323661353530643061646462 -31363037646561623639363438663538633837376435383139386264663335383335646131326432 -64366663313439333939343033366435663338653332353133666431643635373634663038623739 -34636363613861646237343034343436646435333937386234393364646136326264616534303566 -33336137666564633433383564666539323437333633363165373334666137643335316239373361 -39373236353837386162306438333530643961313230366462326530626330653639636232626436 -36616166663562383530363764643861613961666434346264343032333632323733663234636266 -65383461656538366530363665336637373864313264613331323565336632346562353366323163 -63343432303034326535613962306135643134353563626561313538306332396563626166393338 -62353633633262626632306132333666313836323965383633313834623632333461663237393732 -39303735326263653734386538633333383539633166613138316535373562313764303264633966 -38616437663838633632373463343963663939653039623864663939376536313439633331386166 -34633536343039316166613236326235323732393861303465313864646263616365613637646566 -38373639613466623736613030303938356163383064396136636236623738623739646532366137 -37373634636536333830613130626432326137346632343734316430376662343036303566353566 -36303732656635373636656436646434316333643431633230386263633031386431613263343632 -39346534613230626438376635393432373934653830306565363733656264613039306562303836 -62373231393166326435643936623336316232383134316433313764643935326566396336326637 -34373462303632653964656465653261303130363932373337316537326433373130313638363564 -66323834303537363332353961353165373438616164633034646634343934373033616636343631 -61316131366331373937383338633232666463633333643665353234643934343831313266326639 -38396263313931336232346130326562306362383930383461643534366663343232393532316333 -64636430623465616438633835623639326430323731306165653632323335626463386231633335 -66366536373831346162626536343265316564626434353932653364333033376333653238323737 -61633938353739323062393763646635613330326465396262326236386230306331316139633266 -31353233656364303162346161313831653462653339333564376164666461363332323634653365 -64623631333431373765653539396337386532343439623732323832343161663930373835333965 -35373230313565653833376430643466346439316665343836653135326531353833326461626662 -61353532643066343230386534363033626363303637373463303936616630323862633733336334 -64616534343565383934393861626337323763366534616435313865626462636137656662623764 -61383735616264326430663261343234303265393632393738666161346331613734616330313334 -38393064636361336662626466613061623238376433303530393564396666393664303466306235 -65633866303437643965653531363666613866613365633062643638316664333666353633353762 -64643439383637343635613238663833363631353864333664393364396536366631323839613361 -39613038333531623034343830396638393731376533336361356263656166636136346132393932 -61363633376164623363316666386236626633333134646332353630313932303033386530373630 -61393764663331376661326266366130346135666265376262643337323961363161616461646135 -63333634363836613835326666373866306363623233326466373963306134643834643065653035 -31623131633536346233313130316162616461363138653663353238313964623738623933393539 -65316464653066336336353430636236386639653333613437383631323032366561663063313637 -38633437616532343665386564353830646334623131383264643664663133306261613931343933 -31626339376537346431313363336132386164353366643565643632663964396136626161376136 -36613338633961343965643966363437353364363836636562336138343230633837623863326634 -37363765363833663463656264363739616631303034343837323233623366336163626532346664 -33616364323836613337663961663334306164656363666130386133316533626234393864353562 -30353734663233306432633332366465626364643334376339396134353362383733646162303030 -64343861316361653565316235393436316530336532643762633764306637333761313463326136 -38643534333938343731656161373037346534376334646235383363373534613866633062633365 -33393032656231613166306132353934306665313831613034646166646138323164623333363434 -64383736646366356231343365303835376530613366346536643866653237353131363665386532 -63363263643533633537326465643533386435343964306362643539353031376263643561613535 -37643839633030383634313562646636313831366639643261363732653730366433646635396565 -35356230363430653137646432363265323936376434666230666139313733393564653561393162 -33313230616563633232626462393434653564313266363437383365313031613139363838623663 -36313834663434396365613961613665366632393630653233643264353338306236306365356530 -38643432353666633764636666323334356433666162373734313838326363306534306135303634 -39336438663564323266653463656630313539386632316434313133633961356163346232373438 -30643135323935666532306337616566663835393837303061653437343038663036663031333134 -35613036323039666136623937353261623830356230383339613364393166383431666635356166 -64306664333134373635373338363564626165323039313630366364363237333762376466363238 -62623666346162626338633032343837336235623838386534613064323935643834336331373436 -61396262646338363037306138656266633331326333363837646138626436363938656630623435 -35613331383633613335363666633062663836383033386538383165636431373139363964633739 -36636232666533623139646135333739343961643431623966326338616266633463336532313235 -33386666396639376139373131663638663233373961353262346234313062376365303037663439 -62326532643431356462353562333833323830623735363264666661363065303865316130393437 -34633666653331326130626131313437316233353434373663396337666339373364656238333134 -64343962633261623265616461386433633330373837353561363035343664366338353238643763 -34613862363232656235313361613132366666386664653730666435383965373230363034313266 -38616531316134386564326430383433366566316231343063313137333535633666623632376463 -62363765656431346133336432633966656462646263333139373265366461616139643363626234 -30306363323638316166363237343164653066313737323638336434343233383966613933646435 -63313063643431336633623466393361656265613438663135623063376562393463346335346135 -39363933376335623465633239623431363436633165336530333262653366363036336431363231 -30363338363131323562626534333038623862653237396233363766373466613837326461353266 -37306238373862626632376466616465353865373934333136646666323034663735383737336566 -30343139663233373333353563363762386334383538326136626139343062386363393038363730 -34616433643036303734343736363335323163353733373435343064653463383561313761663433 -35363962613736363339653237316639396261326461633862363532333164313437313031353630 -36623233393539613931653730663664666531613762666564346636393136666663623163646165 -63333066376535366435376161306333333436363330336131353532383734326635633330303365 -66643234343534333737326164616361643163343265386261303065656634356334336436666637 -30626137613839633937303239336230383731346631643638663330633030303961356539373634 -65313161643563343833376632366533636362653035333032313037336237653061663862616532 -30613862363839643266333436653030393335306461366330353361653431633836353563303436 -39623361323661396537646434363837313865373833623538383963656530626535313765623530 -31353937396565353663376533646433336130646139343735636461313834613666393333653830 -36356639363965616433663638353435656365363632613635646566613461336332376132333537 -37383361636663326164636265623037656232313831653366393231356364376338386133313538 -66666435613836343462383165343330643166363237633038356338323338393837376162396261 -39383764343533373364633039633634653233613836636533666561313961383566356263633830 -34393037623565663261646437363939363638303733633832316666666263396538316337616637 -64656466623231636666336463653461373039633738633066363334343265663937363235633336 -37306366666131303431316664626539663565313930666466303166316661666339363362313465 -65633931393630656531363063333530376562316162306137623533316230363733356330373165 -35636135623839363938343431623765323430353634333538663964313463613636643136326132 -39303938616436623639376536613131633838333438633165643735616664353130623134653433 -39323535363830376136386439363162626533646661363062373737313962383039663236316338 -63623331333761396532383666663739313366323364663931303033646565383532333162393835 -64306635393366303865643735656465376135316263356231326236393362343435656165336430 -34353261366661313866313433373162313961313263363632313837356634353636303537333637 -61636263326165393831353432666566373432343366363334623932363830636132343961373462 -35373338633731333437313532336333306530363062306161373937656639346161383866346334 -38306539646366313366383934623535626434333766613735643433326262663139663164663632 -35653130383934613532356364613030656134323664616465363665663633363263346363303764 -36633634333965393138626562313666636233346438383036663364303566646238633131636439 -63633532313637363365663736356236323330653734366163343530326136623165616262626334 -31643335303264663737626437323234383134386139356435643831613930366165623237393436 -34326135323031383966333134333930333138333938623765656364616535633235626664343333 -63613464303633396663343164376261663936613832623339316538663764363765313434636433 -66663666346435336332336165366535323365616166363933306539343333373761376435336133 -30666136353265356536306434363038363338323361356436346162343962623061656466343234 -31616561633937643330633734383131316364613261376537373039376430326165396333363066 -35623833666230636434376564383864386632636365336161383934386464343464306438346331 -66326333383865646234343666303233323431623339326135326632346537363762366334643930 -38366133386234396435383237376264643034326233336662666239326265633562363237346663 -31303034663637613734653562653365333838623431313562316135623263393135313533383762 -66326339346564303965383139613161383664363139666566633439363564663032613739323530 -31653335616234663761393738313831636563313265656639323166663137376366316163666631 -37623936323733376234356237316235316132653038393036306631366262303662313563613435 -62346138376435666633323661316233643863366336363565313237323263633830653931613336 -31613532643233316336613130373835633333643463333338646530366230363834346631633065 -64666238386663333837613066363165626537316335336165333533616266326539356134373835 -31323333393936646162663030333237633365643537356636303637383030363330616564313832 -64333062356535323437366362653539643961663066383934646338393237393635353762363762 -37316433333339386235653630333164356435326534343138373364366362363335303636316232 -65663763663765303261656331336563626339373339373131653062636265353334303438313130 -31353162393265313636666462356639346535386430326139613536363035623265626635643966 -37643338376436343265363235376136666166653732653536313630356463343939373939366166 -65376165313933376231366462383038643261666262636239303162623861666566613936643364 -30336664346239383339356535393862366562643064353438373038326265646536646636343365 -31666166326464653032306630663462643261643230396162643538393335316465626361326664 -31303765346434383133383137383435633065363931393366623938663563396466326537336331 -34343134646438363333373137616432373536653164356665303934313933326563313836363530 -39616666313463646162663065313739643664343665653330383137353731643030353135663865 -39363738666631633339623831306666333265356434383030666563366266623164383730393261 -33323538633233316238633038393632396162643736363535376362613435316134353336316166 -30613263633266363039303962323235616662616165663935363131313761616165336133643162 -37373961656339623866363166366436633436396133663961303135663131326339656331633338 -39643933333837343366396164336662356566323064663838383930306463316535633163363639 -61396537356234643065663561643166386464316564326531336264636265346233333264303064 -37363232343762623030663732666431363164366366633131313164336232336266643331353636 -38643731393034656464656431313834363966386133663330356330633036373831623636353564 -66346635626435333831663563396337363033303935653933376665613135346165366166656363 -66343333383466643462326532343863613462313134666662633863363663366230643531373066 -61303139333636393162373961333931386135663263336165363137643533343066313732633535 -38313865653437613163636262303033666462613737656134396130353566343534636538373439 -39383633316537373138316363393334373836356530316338623737663436313565346531383362 -36373034383632626135623335663031623033366232333136386334303034643934313936653264 -31653633373735613838626566656333616466613132663465653861383439646562343065303432 -37643533653265303435666432333961386463326165306165393232326535396130383838373961 -39363166656539633836303234366336353662636534333164353464633036333561303432386134 -39353565626132326232343330393032623431663232623635333439393431623033373462643232 -33383561666437383864663730653865633961333764616664356634383637613830336264373633 -32303766303062356238646131366239663233313430636235306635323636613139303730346338 -32353333613163366364643237353336623438356535383733373438636639343336623766353861 -32643735653165633564396266643936343732393535643264303336363734383963343362383733 -65663164333036623633326565373532353530343232313664346261333061326238643136386637 -63346630376434613761336634343836326334643163653661636436663833653264346632383561 -62306665643631386335643438663064303134353862353439313465636437316633633733383165 -38326565343764653765646533396238303832666637643761646165326336333439393932353532 -35316332653837303962633635623338663462646631376337306530356631353036353961383664 -35643832646531383032326238383931363163626136333963373265396636643663613936646339 -61366262303862346164643936623764343233366362376537393633313962323666303065616430 -65616639656666333737666463353935353138313065323932636334653431393463326139623736 -66303832623335643030616633376532633932646536303435336332663461303064633034613430 -63626439303539373762643861376534333066303265363135363130363961613161636164383665 -61633963303836346533373033326532363261366138326261353631323338633038303261313830 -39303533373766396130636434316434613939633631376537626435383732343136356461636536 -38386663633636656533613736663338626639393433383165393331353639643139613266323634 -33363134316264343236646362656132386562393834373333643764323261303831653765323336 -31336261306261333236303537383164313965616639353839393137623363343630356662363135 -62343763643232336538653130623464303438396431383737656365663564626664666434623166 -39623062333761346537373263663863633531663664616532316263303666396134333731636437 -62366663366531636130333463626330343563336638373539646636373961653837386565353037 -32376334353734623234626463306137346232663032656433306464633163633531326364393335 -65336339636463393631326665323237663165343634313235616166323865393638303231653038 -61663130623939393033383234636364393937323739383861356236643763626262323638653463 -32353865303436393162323532303461346465666565393338353263316530393461376662623438 -65626264363865646561633937343832346435333831623436653133333766396338666633646561 -63356232353539646130356666323730333030323236383537336263613035356339303564303563 -38636664383762343737646237656336356563633661636138613966363333656632323939323433 -32353139363733393538333434616561356536386331613865613362633164663861656265636538 -35333039336263353930333230323766363935346566653862613037613433303763303635653235 -34353430323864636331303632633136393563643162336535636336323039396666343038643436 -65306635396539326338643330616165636534636564663136336434386438643665303630366264 -64323136356438373130383835363833383862656563316162623730663834333335656634623534 -30356561623030613830303562323934373731326564303737393634623462343662316563616663 -34663264636334633833626238323364303330313461616534396236373364626662383430393461 -65366635623438373836396132313933356362353763616563666262343865663437303861613238 -32326335623630663263653863343630343561306462646165343862633938636563633431393061 -30363966303466663338346438663939353264383563613361616538336661383138613538646464 -37633433386337616362633264323363303632613735303161343235333865313639616234633936 -66393331306461316436366635643166366364616230613430383333343735616164396564616434 -31323462633563616235616663353362633564633436623030363131373266393465363830653862 -64616332653066313434393238616136656237336236336364616237326461333263356236306430 -31373136623435623265663737376665626365356664353537366262363062363537363239343237 -65306234643332373162313035613966653538343662633562346134393336623938363332316265 -62356531373933653638363465643739646261623439383265373534623166656334663831356635 -37616166663164346366326539343930353534623066666661643031313839663063663433353738 -64356262666563663664636364336132613035646432373337376130303735393764653962623038 -61386561363933646339346166323933656661393737653132353566386338343539353166356436 -64626532643836626138356164626562323162666438636661666332623864626436373462613935 -32653138313234656537643038613537616339356632316634336634323839663534663830363961 -34386531333434633265643935303338643430633864633930326333633461336239366230353865 -38333339313839306562373335633037636461633634323362343836616234613939313839353464 -33663831386534636134396133393335353233343134363663316636346539313337376364653330 -37323764336632383536386261313463336466663037616531376636303335383863643335373362 -32373464643062363932363961636535323831363737623566643461353537653837353832386566 -61646263316137633435376332633962386165363561393934333263613731366334303163323533 -35313932646338343563396635386638323165396433663062626637306366333566343161363037 -37623764323532336166386333613661616137616133353263366562393361316164313532343564 -39653765306334333632646361643831343732343462376338333861373565356333306333613861 -33343934396132616630653665656134353935353737623365303665323330373537393236326161 -36613330383865363261636234336664393965346230383731323866663531356637643063326464 -63663733623162653035636166653861383665396232356638633131626138613233363565336636 -31343136653061396138363238326530373439373533373037316533616564383430333864663238 -39616338333034623630346462663431383466346361326463363731343263616534663238383632 -38643539663262306463386135633039326634663439366139303965616164643265373965333164 -66326163313465666535653333363333393135303833356431333638643032393962646238613164 -34616261336630613263636562623966633830303564316239346531626266633262623838346236 -39643834653435373335653532393165633265663134326164643661323062336461333537346463 -38626133616565393137663231323332373164663534313839383262616235343138653531376261 -39666461613133633264646530633239613033666261336536623837373866643131346532313738 -30666633303961333131343561623566393138633238656261643264373730303031663439376366 -37323238643735373130313430376434653338646230356630663363623265393130306139313262 -32323266323531386565636335363762323534636438626130333832336234313635333733646362 -36613962633066373336623132316235326437343939306265303564643834333933346130313464 -36313635366664386133306366646565343566313336386262303737656463616531353736343037 -34366334383931303561643162633062646130346432636635633634356632373431343532353031 -37646633333739336139343834393839376465333639643566656330366234393033303534376665 -66626138383338643464303035373039313231363435656434633262616464626639326437313832 -66643533366234653438663663396434623937663832306133393031623462316462373438646463 -39363436646431393162383836613365343036626235303065656631303666396439353932393564 -64313832383064386234623038343732643935643231663736333931613239336134636465343933 -61376130316166663439373239663434336462633635343839633430656663636137646362343135 -38613631626465303234643938376135303964656237643863356137383533383261666165653936 -34386237396531376464373337393939636434323361643232383031363463306264396534353330 -39633634656639376462633039373963303663323334663938373837623663313337343261313335 -65636163326266313632343266326362633835313134633966333064623138336364373537656662 -65333933383761376666323737623939663161333234343233336663366465613733653562353031 -33386337636465373030393266366336323061616636323564363866393333326137343161326530 -39646434396238643239616235393634316538623833303430376531393535656263643038356265 -66316331666638663033623966633135323431386331363162353066663134303535333833666339 -31323531646135646139346533663530366466393430623736623562333063376564356161373862 -62356564643730396639306633643336643838303565303237653931313137323435623263386139 -37373535623966366562363962343031313733373162396335613964663662356631623439353734 -33663234326564376438303731643630316235613136636534373339346162666431323166363338 -62653934323036353739306333653431336664646239373561633737666166356562353763663334 -36636133613964666336663662383861333466346664663232633633373061303033326633313461 -38323035666163663638633532366538393430356137386533636232326439666439366536363337 -37623163376266393738393133363762656563363131636361613834376162393335346232663732 -62613535616131343830303665373861306430626632616639396436623033626636376630313036 -32653363613338626431356430333635373162343737633264393937373162613264323465316136 -37663762373832613630383065663863653039646233653030383436653765353230636132373938 -38366533396564356231643331376639363131383461616337366266336333376531396634326466 -38643136303233323964666532393035323432323932343065383962396231633739303866623133 -31323062323937366130623438613333306238643364356237343062363164616230303432663961 -61623963376331376232306238313666363461376235633162623636376231653737653361636262 -33633039343665613664306334646565363165613663323438376530303133636136626564316436 -63636137623463346539616461653234393966663465316338366331313861363236376535666434 -39663266326134393930316536633431363163663732333262613763663130613735373634346634 -34666130393737643233313466373031386234613030373038383530393565373463393262656238 -38333630386237383139323764383037373034323835643162636438386636363134316439663364 -37376638396236316138373233396531646666353235643365376435623933373162613938666665 -63336634366333353337313531333730383738353036643139613831333363616366396230636534 -30356666313531386261623737656339383964313437636663383263383839666234666664653632 -36343833353862373366613834663264313730616364653830636566396630653734666562656231 -63376161326432656531616366656336653461626563623261326231306562613964333238393934 -64623439316231356466356437666237323031663334353461393734663365343631396631636432 -30353365663135303365346230653330643836643930303135636661346339376563373163663536 -65356164306238313434616230383063356264623865353164343536333331386235633931386364 -36306132643935616633356439346433663363396636373237353733613033343761396564623463 -66633338356339336135613632366265653136643863396161396263393936613431323932653461 -35393435306263613035393231373534306431633639336364323762323832623064616636323636 -37363465313631623734396162333965633037356462386566343133373638336532623730393434 -38363664336463313264346539356434383533333432643163356161303365313063653165653530 -65616665343538303163306263633039326462306534383362376366313035366566363837393630 -35393464343561373063313830616264323064333035633636333937653433663636333431373137 -35326665383366363037316436343832353932643532613464303937376365303264633137663538 -35663761303638343566643661326665633936313261303434343636623466646438323136363664 -31333434333036396232333232666334623662613535613931343235363562353233356563663264 -62353063336632326633663433613065626134386138643134623666313563623835303038663463 -63326237373434393266323233353839393139383431363063346236663034313039376465383836 -63333430333838343432613334313339633363366331313432663766386533306432323461643663 -34323336333637306334356631333536366436636364643334313634636439343565636438323536 -38323036663165353861363730366235333764616262356562336462303634653837303162333863 -65343932623630306439373836656464663337666562316333646437383261343231393837396630 -61656531643337643639646464333463623434323465316534393432636563303131643638643834 -38386130373530666531373439653739383365346163326431663763663866353735326261343931 -35623866616535366331616364323338343238353362653464346265373734646262366531613335 -35356162623463306661626336643431333137626335636531633332303165306431313337663434 -38643239366335346233643533656130653736303461353239383732343035323663626265363463 -33613961393862336638333966313766323031343263643231393435646530393530626665363337 -61623339613538333562343565303033646631666163613031656635373862323831396433303636 -62653462373138393339653234653636383464303435383634636336613963353466383638383534 -65633730373465366430326634643362336435363739636361636365643632306661616137386363 -39343534393433326439663032373161663065353334643735356636613236353832333333323066 -64353563633034393131353333336564353136356534383035336232396530393638386437663338 -38663561333064356566353466633962333633393036623636363533343865656562333161623335 -65653436353565623430363461383934393834323632666665356163616462616632306563333039 -65303533313166616634636431363862383261633139356334643861363232613631363333346366 -35326530343933633037303163656434643933343332613865353761383863346131366338336636 -37646433383439343662616532643364613130646430663834363331643066353463633332613466 -30653261623963393238326236653037376532356337656630303436306435343163316666343833 -34366565626361366432663131316532646131636232613133373431373963643337356337303830 -38663238393433653363613231333236613539663262653635316463653065366233663732373331 -34373363396438616265623737306361316463633662326138373038343931376133306433656136 -32376236303536656161666261636333623830333538396138663533626436646363383066393332 -36616235653730346166333164366530343731393539616130333264623337346134646134366335 -35663331303763396333633566333738666530313864393539376164633265396564626261386566 -37336539653766643231333832376566623561363131633136633961623165303231663163656265 -64666566666166656131633066373834616639303039613439336233343231393864346232376635 -36356464353538306432396662373039313035333635333662643037383261633635613338353561 -66623031366664656638636637343834616431393732383330343531343836616332666261376636 -34353936306565663332336632666162353362316331356338316534343266396361303761643736 -33636333303861353034613361303565373231326339616264643936376631633735303736346334 -65373964336433313436303338373238643565363765373433333033646231333763616661346531 -32363133643038326537363163373337643266343934323935333936633362633536336437633332 -37376435323564356131393337653636343132306664343736613166366563653234363430386634 -31376565623535343064656665646638323731373263393538373464636536363536303562653438 -32343462623766336464663065353530383339323266613430613165613132383134633261346262 -31316233663134373639306530346332356163343236393163613834663732333630386434396564 -66613633316264633136616539383662326139316638323466386535343662333331393438396266 -64613563626437643635336366353765633130623039323239633766363634666361663265313562 -32656466343764646166383534323931363039373762386364663062306631653939343838373030 -34323161333432373462323531653438376133353737366361333332346439373731326662613161 -63616336376562613334323630303166323636333566313066346437653566623238393235353465 -33613262396461633539646164616361336432613337623264363239613033396130393366316232 -38366566613931303533313737623237666331373235386532343431643030643761306162663032 -64326564376533623162653337346132316265383435643437623461323432613666323437363766 -66343835386636643039643137626135343339343861323236343932366661323736303935373538 -31636134316661313233663536396638363632306362653464656432386261613530313934646161 -34633139363733333935313464346232336161623530383563323934633433323561336332393038 -64663966613131313233326436343465656133373732613136333932653137363036643465326533 -64353832313836386330383765366161316633653934313063393764333638386637643333373364 -32393365313164383734323062323439333161366530303262653832346239366634636130613238 -32303263613266303733336539316137653034396435366466633939616665306339623566343137 -63656163373434633539383733316331613431366238303335653835623731613532663637323464 -32376166383436653262353162633337366430353562343439373535306636336132623664663536 -35376136643339613732383161326666333132366565646638366161353030653932333030323235 -65623264393363643437623963326533303765323438333065326531643265633361303539646438 -36623330616330383030653664376631353831323564373433323561656266346662616262396534 -32663862613236373464343935646466666438376138366636326665393939353635333431363531 -37303330313861636261326533653263323036343837383332613339316433333132326262306236 -31366465333763376131346663323465663636613736653263363632616462373230656631383435 -66373239303065643133643566646337633732636465613032333864376532623065376234623264 -37323931393536656632346166373164646136613863383737313530663338663038346634646331 -35643563343665316163356332353564613865613035643532616530343233643335333531353832 -63383435363864326337313565616666663130313537373435666639313435613933643363303839 -36373035346430376264316666636563656363643366313566326464376661376436323439386434 -61663539633761656566643438626266323739326662346161663633626463363164643432646532 -37653462656639623465666465333631343235663762336239666635653637353636623665663466 -37326533313839363036336561373066343539393633363464363465353339386564363037633464 -35393561383237623166323639646437626163363064346132353639313235366532393838363564 -33316339383537643734616566323931313763386462363834303863633738363265643364643031 -33643135353935303662623538373332356333336634633463646436373666383038303639306361 -37323034386263613335393134393961343036643838323664353137653932313563373535356537 -35613461656265643337333735323835613439393232623666316635316232653763326466373964 -34653866313461626664616661393133623365396165313634366331643538643332366236643262 -35393163616666613064386261383134303638623462616332306461353761636565383564326563 -61303831303832653261646365323162383862323764653532336664663662363365396231316236 -64653436613664623537663964613334666234373433626330363837656438353361323834336263 -31393065626562363166623839363130346635333539323536326537613436663562373565653139 -36353961616665653331326337356635666563626664366661633436373066356138653066326331 -30383461326338633735323864396630623961386434386365396361356565346237376265636135 -31313939333666626230306165646539653233656565346265323561616339643735333330323864 -31346336656336386331663838336663356666386465303362346638633439383861343165303239 -36653337393365373961613562333236376364643130386438663162323566313362616161376666 -61306335643933616230653835396665653736636632643937623432343561666532623964663266 -35643366323034376535333238636332313262313931663563363733376661353437363331303964 -37656237346539616662393638383234636339363261643739396633313131626465376633373939 -65323830613130356131626630323165336535663130666334336631303432386161663939323831 -63316334366264626238633439633464633265373366613232343932656534663265656538613335 -33663537363633646330393866653762373563623665386564623639643061353533393064656464 -30373463386233663465326161356264326531646661633761636635346663313761346330336562 -63663137633862643866346263303637316561356563623736353630303535383538626239316364 -34306532383630313834363631363665623139323862366533313061626365333264303962663939 -61363764623830333462383935313063393265366232396561333337303739663838303337343337 -31366239376137656663663038626164376534366263633065393438616236366332383330663836 -64383731303237363763326434633436393539313834663932623363363964383362316138346633 -36663161363435626537653238373566626432303035643837343030663634633837343263643861 -35663135653962663138383863333164646561646438613830363236613366653237386663313265 -64323265666630353339346161656333383862316437643832393937316530336134623564363263 -30373631646233646538613831396136656333346663313864393164363831343763303335393733 -39333566616663343137646465643131636330343432633535386436396236353233393861613531 -31373565616431376637616230373038303230393765333139383466646537323739333035313062 -65336165353738303634376161656465633037623837653665626432646438623863396232633262 -61336431393566366539666333636664383961646464323939393531303931333038363465613433 -30653436613635303331643834353664313137393664336530383735653037383761666639623631 -34623039623235616339666331306666653766366133313166393363616661633739336638613036 -32396666396635336437626165626338626234346363386264396632306139633461316432316132 -65326339393064643639306161353538396139333531303030326461643731323534303061623336 -38643639666639343736656136623862313065336632623839346130306234333661336665376436 -37356439386239383465343331656338303366643864383338343264383434306166363739366139 -32336464616435316333656632656637633336646337306335353765323963383433353338646439 -37393935633066643262363466383134613432626462613730613061333137373563393836653734 -61396132313839306363623034653837663461623730353631396532316563643036313065366438 -30636431336233363361623535616237303836366536343333336666343731613262386130383039 -65646132663638666265323866653236306563363331376663623263346235613939623637643736 -31366433663532643139343765656430616239653932613364646663663964346166663631333831 -65373962323165313637333434383562393533353631616562663932353562333733313934663234 -32356330643637373038623838656430616261633461343839626236346166373563636630653836 -62326466613132353030663035643665386634363331386330333535666231643837346436303134 -63393430373132613933343130366531366233313338313837653062326438336238356534356639 -33656364356537343634333163326636663466383861623764306530346366396631353939636263 -37613130353563663233616239316466666462366134316262393936313961326632386638613166 -38366265373365386132313636303232653864336135613233303963643034353738353232613134 -33643963386334346366303164633064613532373035366237363563316431393339336136323862 -65303730303365336161316439356330613135336663303466313864616166333364333534323535 -30333239353835333536343232306366316634313733376632623464366336663930373638646661 -33666364343266636137373263343561313731663238653165646463616531663531323833303031 -31656139303533363562313239623561633066653533653231306664336130666532356463646130 -31363532373832356237636237393764633662336338643638316236666462323736613561636164 -38316334353765343662666237353463333666313537646661656330656366613563626539313663 -33313134616661666233616130343035636361366537363562316136323933626430646631616362 -30666333366435663334333539336666396432666137313166386664613138643438663936363035 -33313930633336316433356630636363333465663832313163623238636466626631373463386364 -32643032633066323764636134626634393264663136623466356533343834363134633263636565 -35393965303864633936333933653364396132653261616530336261383336336630313734373963 -64396139336664363165356539356666616134343663306565633333343035646331316631343561 -30343066363135383534303336333232323538623239666162663263666464393861356131373661 -38353130643937633736613631333033326632303265363935393131303930636437633165323164 -62353565643365393438656565653662326430366264306131656639303661336230653461306637 -33666532333364373466333363613439636364343634636336656438363733353037343764353566 -34636530383336393331666464333234633665663530393135623036306634376634653238623561 -61386333623564303038323062633534393135633235376466613162313733343037303630323434 -36326332376131333638356461303061666362346637316431313135343737306635323338336161 -65343561346337336363383534373462343264306661383337653264306139643930363139336366 -66373265313262376437386462353438363934623666336533313662343763633935393961353662 -32666164643230376138336336363062373263633036313938306538376336353630356236393331 -63363431666265353565346330326637663638353737383363663233376265643233383939303164 -37336561316265313331373739336431373837323233636464343261393836623636373335653963 -61386161306566613238343666623766313238366133646465363836613463333432626437323735 -65646435636661626231613537666562666130613162633536643933646532333831383764656461 -31653735306336353831316266313166303466386566333964303434353865366266333936623838 -37323061656461653161636133326163326364636233366263656234656337653133396238346139 -36323030656632383864613165303264333363343036653062623630663763303534643836623763 -63326534313233343237366661343765626561326363326664356635313563613239613139626231 -34666539383535396539616461626439626230343231663963396531623934643030616431333530 -65326236313230623338343966373165393438613731396137303764346231633262353639383162 -32656530343630383236623366633436623435656433373864353335316230633363623833646136 -61336561333966323630303165333765353239343463303433626665393731393534333563343865 -38663436303464333833303436306332353835336464373439306333626464363233643262336535 -39353330376332373034666530613164643038353765636566383133623663613562643063353333 -34333236366361393639376137313061336263636132376333346639373136623663336436323034 -30336662353338333335616663616664636231663661653038393765326166613163333536393435 -61366462313166666430373039343163616432623534663136313830653838616461626136343238 -36626431353230323232356433653465373431303562376334663135336537643032393066393961 -37616330333436623035366131316132343737346664343031373534363631336435333961356434 -62653530306265363430316364363236353733643962356165346434386263383537326135393630 -62636264396632343638303835663339353163363665613465636466653263353731313631313361 -61303039336635336133623038363732343863346462376361373833386631636237633737623636 -61323962663066646131326565393135666239623933366661303435333339393039356137623764 -38643030656131303935623532393333333764386431656538373732383930656164383764663933 -61363764613031373636376330323964666335656139636665306137633962313165306233343935 -37646330613735623666663132343362643636613931383061303534306137636432386530353436 -34643564336164626366353364663762663864623062666631356335653337643533353932396362 -31646261656234363965643038326435366562363834623861653632303833656532636132643434 -37336439306539333039653437343730383135353763376532386334393333626465386137316665 -37396630376662623038346265656639323038396334303866333234653966303432316463313266 -63363136646262633661326464376337366131613334333566636433383039343732613433393336 -38663462656565353139323464366262646132333265393931313536666638323031376533306661 -65383431356337346462633636343736343732323138623534336330653463366633613336626566 -34343932653861646431623632616238623666306564366335623039343733633663633065393962 -61653435663333373666393266663132333734393032306533303134326131663737393033313938 -35396238336165303466363434373262353638636462666436376538656333326630653861633065 -31363266646234663630346363313639303538663964333866353065356661316463636234656234 -31366138323663323931333433333566396163636463343335646234323337616463376437373865 -30636630386561663264616164636261646430623739353939303862643565363165313935373837 -66666636656163386331306134653238333632343039386366376639633766613338613862616232 -65653134313839363665623137646366613863343030653534373434316162643537313032386335 -32643964366632393137663763306564643631646333393333376231333262396535346562313034 -64326362383430363332313834656231663962356430366536333033643438393362333465313935 -38313831373739636631623931386630653039333939343735626638323835386330316531656462 -63393761393339396536343735653338373462346564323565633236393334353736393232366263 -66326536666364343536633462356335386261393935666332646461303236386433383435313462 -33356437326336303663633538333536376363656435303765303963646137346662663865316136 -66633761336138623535366333643065303163643163323836323535346664653537396331316238 -39343731363433323535326634303539356634613030643038316161363565323262643664343535 -31366338306565636434366566613063353061653464336435326339393165363337636139626433 -63323333613466323566613764643664333862303137663235643464656336626233613938343739 -30303732633661383463313963313235623337383333376330323835623430623465326538356664 -66643232346630653961613932663565623132663233346333633563643063313364346666626432 -65636664626139373438323063326634346133613130356537303464393864383438323434316135 -30636531356231383535353138613930303965623039343531333765386532303439326437336230 -35643562353266626434666135653233663462623339393563393162343333653163393963373731 -63306137333561343065396465653966343533663466366163333162376564346161636538313730 -62656334623365343065373737373863616139336539636630323361613738386530326134623835 -36393434623436313465323663366435393065646631666137613033366139383464633363373961 -34353534393930666535323530666434623266353638643639323634656364613933356162383735 -65386330313032616230613130653962303633323861653839383364313138393937393464393532 -32663931393831623532383032393064633436323364663831643462396663316666653832616461 -66353335363333343833353539313831626539313366623864346537663466666463373361333166 -37323764326337653130663732653636396333613064386365336438316462623939653535353265 -31613030653239636536613862376135623835656365643432343332653164663235663132613335 -66313665393638386563646331653233333735633265356538356162643032353262316238356562 -64323964643835633534643338656239326362323666643632616439343466623232643337646538 -64353866616338346161333839623935646466373863393238633331316538623037613465346137 -37323733643835623066396632633131366366626137323230363561393936313232333236623464 -62616434623232333731343261343233623164373463336365623434396439653131373665366233 -33653831306133666338646335343534356165616238303163343836396665303831663038356430 -33313562613261396337613565656533666337613331663530313061616335393433323166373762 -64646364663139643531636635356536336664616564653766393739373364653230336664343135 -64326562363431643634303537396339616232343135363835343337356431326132333962663635 -63376635313361383965356536633432303832323236333432376364653862626438663663656234 -35646233366261613366333533343361646362346563376531613436633166333739386435313931 -63396166386639383738653938633863316533653162346534366362646139386437653137353431 -34663962306537353634366163653039383565356362626438313761353133326463643532306636 -63333635373138636266376232303466653035323839313231626433393430366562383738616633 -62363438313363393035343165393863326461613864623262396138383965363237346131663135 -34336162303636363664663566666664616339613332613662643934653631623233633332373136 -31376163326639613961633134383533633862633162643834363633383365623632326336346134 -64326239336136343364343332613539626664616138363039653136346563363438343365323264 -32316361326236323562386337386630313638313231363063623639633331663966653065373037 -66666131343363353435373930313630313665306339653537393935366636316165653637373938 -31363437636361643761396261323966386364386166626234373761656563623731303861663230 -62353164626530363462353531316430393430353065366334626535636336323331623739376136 -33316533623765613131343530363432326562656535333366356263373533343631336663316165 -63306231663831616635333430303432623138363235303734373033376361363037326366313763 -62353164376531353764373238313139343237393839393530656233653938373030663335626630 -36616563393331643861346664383036356631333365333735343130306639666539363363613734 -65303230323062356337376338303163333836626434613661366362313261383037313633616535 -35373437396133383361626630646462393162393834306632323063366339303437353438313766 -33633061373964373236376236663335663563386438653435366331303336373137326134646231 -64353761616331646665366334323434376435376338333666646465376261306238623132383134 -62353834656539326266643237353431623936323861353130386532636433336266323462356131 -35663666393038333535333663356630653835343866333830373536333637313931633837663537 -38336665646331393961343939356336653234653839373835373662363466666630356630336235 -61623232613130383432333165636632316463323133303331396334663666306661303337633964 -62663739663235353036356266303733653233323730623634313062313065613836666237633062 -34346566333037303861336339326631326639313864326262393835646461636534613939353862 -34626531333961653534363033646464396437356635353339363737663966653734353736333439 -34373137613465356163393633316236396538313062376331663739316336313230633466663930 -32333233626565666635353933336266613662396634326663303739313065353536666466613831 -64303565376537303865353162303264653637643863343636313533333266386337646262363432 -34613433353134353232383233356334633030653463646333346664663934623466313166633561 -66353366653663373663653464373038313565333031366639306165636566346533316566333565 -37626462363330656537393432316237386466396437653835393366623666313661383933386532 -62386264313463656133616563376463383030373130363466653934303562643439613531383334 -35626536663338373563366165623235613439356131616466623835313965646565386639623432 -35356538326330663636303062613164363230336262306339343037303538303537376362326232 -31656564386336316664633565643336323732613331306663353864393535363562366266303231 -32623532353233623364303731373265326537336634363535646636633161363731366537633438 -37383261333838306464643034666238346263383737353733646663396430396630393732363835 -30656430376336613661346363326261333364643831323732393132353835656535376537356439 -64393432636530303133333730383330313936636439303463663736346663313338363435633236 -37363730306535613831326331383837376336356139306362323034393231333730646233356535 -62663537336635386232613639636138613138363161376434363931363933396434386564303366 -66393661306266396665393230666438653966386236633935323337643663616665623262656638 -64353730383835336131623164643565653232666136353664626461353062633936323266613830 -37333730613435323063353334653430303862373565326239383964386634663233323330323332 -63643938643138623531616435376333383034613436633937393632643561323237623663326665 -62633036616633646265643065643064346161383838613565643266326139306636656631356531 -37393162636663313866616232313036376461666332636461343865383430336437636438393264 -31633138393535326662623631383634326332313333323232643065376132343732313266623333 -61613938353962626639393565393730646330393463613266333535376364636133323531343364 -61663764326433356436393935306466316431336639376434353039343530336637613332653164 -35376334336239653134383036363961313865653534323665636162346164396637343463393130 -38626137383330663564663135386137306332646332663237313164313936633933376562373766 -35326132386437636238306464623832396365363963373863336138303739386438333466663734 -34623636646434303839393435373262623065353739386266323935666162383234643263363666 -61323236343139343334373162663263313062386466353161616364316437396336376434363633 -30666232306536663038373034363462353138363231303235653736333235623763343437316339 -36393730396234396335373763343037643532386432653433313638396166373930656636363066 -65353835386130323964333366626333303730343736376433613132346333323062636532633164 -39346436373433386563656266373633633233646639623863343830643138396338353963653834 -34616239623536663161646164376336363037636638386232393231643334366436353138656334 -64666362613764353565396464613062383931353930633830353838633139353938333537316632 -38353138656339376263353039636339376537303533303634633063336139663065303763633536 -66383063646431623339383861383133313932383237383162613630643161656639306164363263 -30356463353732356235663037323339333434313434323062316431643439363432323162656537 -63353061383232316466356164373035303630653837393537373362656639316235613064336139 -65393566373738336435326137623736623164626463396432323635333765383736346631313335 -31653737353231333566643532616364633962336664363236643238633836616335613035653931 -39353435366638613134623531313266386162643664363865343361613830376466623832626437 -35663539303430633464643234643062616364633065656663353463363037613030646666383936 -61393836633439313135623239396566316230353835616165383734376566393039613737653435 -35326536636634316665396237653866383439323465313130303232336532303634653164326664 -61343038616666646432303166323030633863346663303939643832376430343233383639616439 -39383730633763313364363463646631346336363765623362646165306535376433346363366137 -34393233343635313331633139356238353931383762653633306266346135376633316634303064 -31623539613064326130336366646361623538373232616135303131396536326234623737326563 -34363861623662333962303939636563626465663132306161383633373836303464653764353362 -39386538613539393435313638373334373765393635386430343136333036656535323730303765 -34363437653637323939616361363864616561346263623533623934323034333939386136336233 -31663362633632356335613462316535353866663135663563666462343731353762343462396338 -62393336323238653538353232343866306231636136313137303139623530346339623234353034 -32636134323362383832343038343438613531643763303932386234643535333636663531323237 -63663134613461663631663261663934613432616635306462626364643062663161656630646366 -62306466333334623531386432323930636165303935663434366563363262626365633135623066 -38316130656466333737373731626164336363643237343033616261663436663634383832316333 -35363639366237303734353163356132366138333931306132353536636331623938376139396532 -61313663633861643536356538393762633963313538383063613936393130656361363136326262 -35363239643963316163343336323765633633383939323933333634613437363866396239303635 -32333337623332636663363332333232626335356434393338393938353232383737316639316163 -38623266656234633531643430303137396361313566633262623933313162643434333064303665 -66303235333161666432393134613732666539396139333839313239393833373433643261656330 -33383030343334323730663730656339623738376237643365646334383439396166376136343236 -63313861613164653434663566353735326432346561336539353032336633646239373237646232 -64323737303965626530343034346332613232383461353736336264623230386636633466613862 -63393564663538366261346234376465326564316461633762376330653530643165396639626661 -31663836656634353062646533353763343766353563323239326661653635383766626562393732 -65633462303334306531323462333766663839646234306636653434643435363132303938383862 -37336162303635343931386362366265346566363236333339383062306563636438613338343731 -38366237313934336438653965653735333736326335613761386136633832383539633365636534 -33316262396162353931666134663364623639363033326430303933646434633461633730363431 -31376635373038333330346161653263313734333735626230343561626237616632376537626334 -65366435343539333762313135316639303139636265373764363439333336393132383062356430 -31653761643765346634353432626632316466633531343830383261653366633433386134643864 -66393737653964343763353936323138366337323534326136313866353835316137336235656532 -33356231333836306566393561326365313266303365623430656533343836323165633466626230 -34363063333264396565613961613139653362393763646635386435663363323364303737333133 -62323166303566613232306665636635396266636433633434333331313637356639323364393337 -34366132306434666563386264663066343038663164386535623332333539626163386237666363 -65356236336639646666613035636566616562653863663865356461666165636463623432363531 -39663664656138626434623364626630396532666565366265393634383966643333616635626639 -61306233373866386665303032303337366364353232333762363361346432653963303031323136 -36393632373936373964383762343163376635653232333634346238326661663733336463656434 -66316333616532333836653237333563343839643235323462633434313533313339643538653535 -64343362353337373966383364626534303430636137356535656532326364373233313339313638 -38393239326131373663653134626163613265343133343835303031633133613733 +61316132306135613237333939376364353366303862636433346539663837366665666434303439 +6464636365363464393239656633313433646632366231350a616166393961396565336533626633 +34326261623363373263346430323238383838313631623233316433633432393365333638623663 +3337633735363264390a393661643439303363623038333366336330643037383031376432306135 +32303466616334333064613235366236653339343834353263663061656364363336373637373935 +36376537336261376637326265376239653433653338646239323462346463396461633566396439 +62396463373864636334313734376235646639356432656132613539306363323866646433636339 +39343265393336343766313039636164353461333431356638386630313332626365386532666238 +32383830366639373338363633663737313632306432616138663635316133343334323431366437 +61356432396463663431636432613832356538653066616334376162653632353535626236343739 +31373163643963373339666132323336356137306262363330373335653261646535643430373939 +39393939383464353134343761613839393238316432663564643162633135373166356533376139 +64626263353333353937646366386133613965643636396534663764613830323839373737636338 +35323035626665363064653433643632363836393339393866666639356261333062303064323032 +31373562623932376531346330653038353938303131653665613331316139393361326561636666 +65656235373536626264616139646536346534656266326533626464346530326462663434333934 +61373533376162653363633235633237616330636336623166663765303036356232303438306435 +36653534623361346161353638626137313430653764383763363432663831616262356562346131 +35343439353038346334363132623638346237343439623066383565383230396261396234643339 +30613637343838323236326634666665356165303530626564303930623664363165613765646639 +34356166386565353638383534363064626163326330396463343034633435353636303864613564 +63643037363739616561376661633439316137313436393237656334656266613165653839383061 +37326636383233373337646665353061363333393264386461326238653161616637663334383237 +37653961356363346364633161343133643364656561336265393565373562623538323931356533 +64613161653138663834303366396532633732653432353438653437643064356263343534303265 +32333935663633653234313063343132636535303031323166663934373563343638376364316235 +63636163343539653037663037643864646134363934303631316364383038333761346533653363 +32613465303062306434363235346337376535663364363035396331353533656361613062316533 +35356631313661366433343463336565343739363535383762383063633164313063396433616430 +63373237393830323765626438306363373331663033343639303736396166663766396535316635 +64376366376235393961613264353832643363333334376335646636343265626237643438383166 +63663330363362616233656139646430643737303538323363326538346162356138303430626333 +61323965366439313034353630346632626134366437346361316434363833633039323261336136 +61333763653332303966353262663364316638643463663664316439303234663335333061386539 +37623866333865663635396532353330336432303239313463626166613665646234353736663237 +35383266353230366164666434323034393764393433306362366635633938376662616636616137 +36373537636639363538383362633439386438623464646135373461613561666138313735333864 +31343639363630663938336534323831346633643338393232313834306462393832363461366339 +35346534626563663062383539353437343465383234316538663666383333666361663730333366 +36316164376431396264366535316433626263336335336333613664323164343231656234373239 +66383066646338383232346634613336333562363434353663343739303033663663633565366462 +31313561613662636233373637633436616562373732613237356239613531323834393635396266 +36653266343932396364323635633834666263313163393834613766316634353833313733343266 +37396363653833306362656231636438363062323361323634613461393861623465623632373362 +63323935646438356230303534636561383738323566373831343764643762623937343636326231 +34376662366461306563663736356538346366326436626231653336346463343734356235343239 +33306661613734336138666136386661636132343861636636343364623836626632623163353631 +32633030363662323534663931663466386161396462633866343637373538666264626163336532 +37616334396435613435663165663435636362646531663764666531333738653662376331363565 +31353635356437386235666266653264363339653732643833623138343930313334313137316664 +32356131363034386334353539623130613535333933303737663533393434383263653233363137 +38623838616465653564326364303535343663373465386438613539646437613431666131333136 +38356665306332396366636664356139363465333064643439646432303563386432653830656562 +38316463333133303564366162363131643439383465343566653837366531623565633432346632 +35333364386432343436646334353438613138376137613031363836633432323334643539386430 +30373734353263663039303132376637383935393636633031313730643332303366666164316139 +38626630303032666162386265363763643237356533313736356234376663353638366230396637 +65386563333036633736326134373961376638666131343830663731356566366133646366343263 +62393566616161383937646363393136623437346330653838613264666133633066653566643130 +39616461333264626133386237313565613263613762313931386166633133643365646332326135 +39393935343130616233653335376566626465663461613036383430326533396638343533366333 +39333533663538396362636636373232303164343731383034343032396531666266343430613735 +37333134353932323533333266383539383736373235613631656438633434373436376164333139 +62333234343061373230383438313263363466366234663231356534333163653361623763313037 +39623533346665326439636634623030613436656535353463373434643833333861656532393361 +34626535643463613563383632373561373235386336616130326439396439333231373261613135 +39383466376635313738363164316363363861313435643266386261333566646536323162656534 +30303362613331383036346562623836346361383635343631323664316665633034316338393839 +36306661643261623866633466393735393030303962633134626230383164393331623037363632 +61616435653866393061353031613039623835633963356537613039333066656437653636306630 +30623631363636383365376266343934376435666464343732613539653434386234393662363861 +66323062323736346439313031353965636463323462313464623230623138396164363439383566 +66303566343632353265316631396266333130373431376462623538343639633037663638616235 +31333534376132353165343362326466366464383536323962613031383030303163633835613235 +66373730646430666230323137373863343232303930663335663434636466383462336662623362 +63303563623936396661323831363938356562346230633961396362663337336637343762366364 +61336462323533393261383139373430396236396431366366366162663234306130393632653566 +63353730643637396161323433313666343836383565383530393030363066336665353637333762 +37326131333065623865613965653064636232613837396433626533613963363363663562623930 +37323964646630383062363962623536333534386262666162336566623837353366326138366566 +32643761613166326133383664363234663263306339316636363663333236623838313637326561 +39643630313638656330343538656139376631316338363431313737376532643635316539326234 +30666634386238323434666434396565633062313130336336326237656132633931383931373938 +31376262623464623338623335373831623035353335653262643766303963373364666163653439 +33663365653761623064376633383564336637363533396435636330353731316531613732653035 +32646530373332373834363565613635393036376666633132633363653635383763613564326261 +33383331633138663466396562303231323562303431626137313334343730336339626163373035 +39333436306634303636633565316439353134393132353136626438643439343766323237386137 +64653165663564356462373361376531356161666364393733386564386437643966373737663930 +61633663346331383139393633303961393434376338313366393937646465396230663631313665 +37326164323434666132383365363339353064646334666131373532623032346338653836373561 +65356135376438373336323237653035376639663133663665393663666264333738393261633038 +39663434633934336563373438306466383630613032333139613035613063313039656638373863 +62636435333230653032376331623937323166653138386365643236313938306466336565333530 +63376435336132613036613564636162353935376466646233666238326564376261313363336463 +39333038613235653832663435623336343064306264666661343062333037346233373664653562 +37363434373131343531626561373436626132656332373934663137356230346434616138626534 +38356362393837643537346566383639663039333565383661323732303432623034336335303830 +61333239383936366439393862363731376334386335646536343333636261653130343839353162 +31363532656638626339353031323263373230643934336232383161316438636130303239636137 +62643737396539386165333338636462363961303630653231303461346436613531613962313035 +36653237613033613237383035343338663830393565653934323666656537343033613733376336 +62653737333638643661653230636665666534343035626633316133623532393562396633383463 +35656161666239636165646462333039303036316661383364313664313932653736326333393731 +33353064316232616261663433353761396663386262353664313438636662656238353331323163 +64643336303433346465646466323338316163636461653732373534366262333333396234366336 +31396434363062383036653065306139383637643533363535316464633463636237383562626361 +39373732316439383139643532626561363863383238366663383162323837363938333334383563 +34333636663137643836356338616137306462303631313639366264656565323961343265373631 +39383334313562303035653038396137323932313261323062396637356432623231643636653565 +61383833626464386230626133613837633066393363653537666462613037616665656362333536 +37313436666561353034656238356266623933633739656537383736353862663862626339343464 +37376635326438323265646636376533376634383733646536323632346662336637373532313932 +66643065653132356364643134343133346632383863376534663233613636353565656433656165 +64616433343831336435636430306336303436383930373930633435346362396536373832613635 +66373936336366633263333334616564623763323331356264623965303339396333613665343234 +38666537326131356464306438623538663937383237333665653830343934646266646261656365 +62323333313534646133646339353036393831636531353663376538613166666435346262383238 +65396230613133306362656635333336666564653663643164386138366538376535323838333231 +61313966323366646566656236333964613134646131626136663534366165376433316438313434 +30393838626231353534323233353332646163633135396233343961643932363831613335383961 +35393732646661613532613262666638333061643862343239376238306165633931366531333232 +62363837366339313232343236663134643330646331303733656665303234663633613161303833 +36336531306164613532646139353734623231366138313765376132356662366232303437363836 +62353536646666653736386663373761656465633165393730336463346637376131646530633063 +38386537343331393832393536666361303362323239336630393933326434386434303463623634 +31386264613238373636303861326363363362363864326432313037323838636462663637663131 +33366137383363313336306662346166326330643636366463323037346339383164326432343333 +32313238326235366137393735623537333035666264346666313465336365323161616638613163 +66393565343962643361363466623031323061383665666264656361633835326234376564316236 +64306566343138613934613237366633363730316564326437393631653439313763313138313335 +63666236343430396232343939333238353230653666636531313032326132613834316562363732 +33626664356235646333303132376565356564626438373233646232643065336163346663386538 +33666638396136306233346534626263386638646536633330333564363739663630333438333037 +62626662663130656539363234393231653237626533343261616537303135646235636461306164 +62313861623033313135666664616266333466616532363363343739633831653839316532383762 +36393133353463323034643430363065646435636262313161633131333562336663383534366631 +66613865333231616265343036626638336137656364626339303536616261313461323038313338 +66613937313462343966383864393037646665353462666533303565386262613334396430616238 +66333861646361363231663562326562646231643632666332626665326339363264346163623437 +37613438373439376361346235636161336561616539323634326131373730333931326565626633 +34306635663063336638653533363437643162633634336132623533656537313261343339323838 +66353539646564366437353836376162663535633139623132316233353533333131303264313038 +35373139323237643730623466336239616366396532616137613530393832383964306663316263 +37656363343661653430323838373133373337363735646439306230363932303363613565636462 +62333666383766313335393330376462303937646334383935633539623135303837643536396439 +30636332316166386336323731663065303362313332383864636434393461303165333734633930 +34666636393161343162663330373138393238643430613837626466356264313366393662383236 +39623036373162623966366266366561646466623966306233646537616138656530646431303863 +65353931383162646539313231343330366435303938323362663063313865373866383362646538 +63356466386165313865363162666330316635643133613239373435666661643233323336616566 +33653730303734626532363265643662363634616438376438333933666235343466323364343833 +34373564666532663332353230376263326430363737663064336362343166616533633862343135 +39316464653039643938653433363163393034363132336531653230373162396366326634656635 +35383332323937623264363963313736363735353138663262366430386138643865616239343136 +63633933666230316134653862333431303664663539363735643762313264633539373838626439 +39333966386361323162386662613333663866366633323236626434323537353038303632376535 +34666538323761346465333337643164336232393061323761343936613162646435373062616561 +36383535646539323031386234383063353164656339353336376464663032666636616262636139 +61323662646165316434363135363735373562376262353632346564323235326565613037353464 +62323562656539383734303536623261323937393837643536633531343133626636393237396433 +39393734623836656533353637306535613437366466393938326464646233646639653062333338 +34363463346161326435333932633030623431613164333034393465653739326339663133633962 +35646133343163626566663233356565663861383033363535376139626236353064666566333038 +65643430376339336436323935386332323531643634663939613333393330656138343334323338 +63393162343662633638373437373138663138376638306537383730323462383566343032393064 +65363439653964653734333665373436613036616533623633643130636431376432616361313934 +33336637363034623863373566303066633332306430303531373935346436326533623364373334 +31626433343637663061343661393866316661313539376634366238646235623437363736306537 +32613430396261316536346336343639656336613638323362663361626461316639663861373861 +36633666383934306364323036306431633164303637366537393362646665613939646431346333 +66666235313766393134313462303031383238633838353238613637366537636466666538663961 +33633664643662653733363162663935663334363832663239646464303636666433633239303630 +36616364636431323239333532643361316265623064636532366531626264626330313430666335 +38353062383866623065303233373537646662623436323236613038643237343262656235386432 +33373930613838323734616239663738393239666166333563646364303366386263346635623636 +34383266653832343431323364323736666266643739393966313630636130343537656261633437 +61623934653639323031393862363363393634646261363065636265656161633165646665313934 +66326664366163633230313232303663383232336639363361653032376364636666373266306538 +62353833386331623336613537373835653263656139306331393830313431356337663738656434 +39313364313561363032353661623065393238656165656135653630643834373739363331626166 +65393764343930653635613161393961653536633261663234656666613930363063306332303038 +39633465646134613562336437356362363734363830366132313336393030303362326438313536 +38376339326632333136646636623937356266336661623836643861616437623738643964653632 +37383362346666626562353039616566333834396265343562623661323130616265616463666161 +38313636376162633464323632323138656361646262313838663434396130613530353734646536 +32373036303736646435613838313163643034326534633365346661386163323864343530646132 +64613335333838313131336462343538383233363061326333386237636436333731383932666537 +33396461636437373965363561646637643737313132663536653833643964333337356365326436 +34643564613036323639313831313535323830613762623765346564366531363230356462363665 +33633766333736396137623137353038623466616632373031366463323334393463663266326138 +38353865356334333036363863393933613035323561333964373063616263333132656631313039 +37323761643933653663613365383235393834383766363964323935633363613532393839303662 +66653930323262633133646339343461343263363361336664613030393165346565363237623938 +33306331366465666532346432653534376137653033653965636166633837313832383733616461 +36343362396534356532626636623736383563653364613235636631643334373037646665643966 +30333132363534363863326462613963376162653039613831383236643134643961323739643465 +65623737633561393839316361313536633265333461393633373565636463323033383962393231 +64373963663263666366303130353131343433393230373031663633383661623539366330363437 +34616138363963326233636233366233386430363461326330396435356434373238346333306530 +34366534316636383863393730643863623031303430353263623532326631616237353930383634 +34653566303931336231333765663736373539303433366264356237623065653135313032393134 +30316164656334373566306234363765373438313365633835386665343962333265333530346632 +38396362643836323930633332626236653130616230623938373761656164653937336136306332 +61666530633833393661626364323539623233626362333239366266626161636561646331616231 +30366361613634613937663461313332306235646538663835333463316133393233623135363164 +34383838373163356339373732653235313038656532343339306362656239616535636435613035 +39393232316235316662633536393933663230373232663166363264613736363364326666666534 +62666133333930653437656437343738383534313663643365666434363463346561396630633730 +33316233356234616264613433343263663037373263333663666239623735653332306430643636 +64646164313164326334313765333834396565363630323137613365356163643531323133323064 +35613235303465383361633732623633646665316165323533666138383330386235666563323966 +39346666616331366333663363333631366465303935363137373337663032366233636465663430 +37393565313739656130313965613864363839393466333033666535643164326161343963383061 +66613166666361666362646264643135343733323432643765363538353863336336613334633362 +33306262356362613635313536333563613462353165613462653163633766336433376430396535 +33363563363862333563666366346233336137656533383634363863313861303431613161626135 +33363132343533383336663738353165333030366165396236636462656234333139613839353639 +34323161653333373432616332656664623733306464316437653664303965636531666538636132 +31343737373538663762663566666162623430363532323834353330356237396434313362376665 +64633638666535636230383532323661666365666166363333383565376236353732633862323235 +30313131393139643563366637376532646538666236336637323736663834653161313730393164 +39356235396238313866616432343232643266343634383734323564656537383039643161643630 +35306232383632376431656539656235316631666531613730353762626666346530366632356261 +39623961616137376334346231663737303138656562333862393537306130366663323563383633 +37353561616462333132613537386163326366623662623866393462333834623165326230353031 +30373866326463396433663938363335653336616233323633663932333064666664303737313965 +61656232363030646136343261343566353361613238373633663831353461623133633965363533 +35383837393465393263613135346637386666643963326438623462356435326236353761653864 +31613139613734343234323036363362653634616333366435633931326336663862616265313639 +33336664623030653166393537313962386661316431326530633439643361303035663233616236 +61303735393061313035656239363062636639346165663339393035636539373339343264646433 +32333434613563346639353537393764336238323332663362386634356134383266633439383537 +34646335303962326536376635623762663732656537323061383639656337343461323832326563 +30303934346133643131373238323234376233646630356535363539613433363632623661323763 +31373265343335623436376462396634653635363933333563353537663534343564303663376366 +33383162383665653630646466303938356535373437373963663737653336616537313065313766 +37353165646538323339363730636264623737616562633564643532343963633666366430313731 +66326339333637316430656437383138393437316161653263343765663862316635366438623633 +32336533653362623636323264663038316332616461623737306236376539333539616435643634 +64623963643135333334336364363966663137366665656462646562616535306533353233616135 +63666661353838363738663463353738616661366539393766353838363136336666613732363562 +30643961316332653564363639383939323934313632343861343532646437623663323136346166 +30633365336234343864666661396533633364313037386637643065343266326532356562323130 +32616534666532623564373735663432363962336634653265313463393630653936306330656661 +36383864323661613264653437363630383564643134303133323365363561666638396332643131 +39663237363737653662393636333762323464623061323838306566393061326361653363376433 +63386461653430653435353431633062353165303632356565356232656133613034656530333531 +61336566316239643539326336626139316532396339356466643137323336343334613663353666 +63363532336663356365303162646161343364353332316666663631343533646537386333633361 +64613239396636353138346562316335303465383135656236343463646332343936636465356131 +64633363373861623463353036616635323238386330653435636134326665666263393433303532 +39383739316335376630616262333161306537356539613764613832646335376539356134623632 +66636666333261613431653338333939393035363534366164353764303638316166306334376232 +33376639646431623565333561666438623062303664653738373735303066343464386238353836 +38616136363336303335623231386531643365383064306434363937653636373037383265653038 +64346366323539376135383239396662343565396135313837643565316437656236363537393339 +66613339633135396366303734626231626462306634656230336539623234613066316136343833 +35343665363939343139316661306134663566386164643231316330386337646634663962616362 +37616635666532376462616261656562346330353830663239393961376532363833393962353434 +63326137313964623466303163373866383937616339383739616163343766386131346430373062 +37393235306635656231646435353331363263333030393338343336613336633366306332643464 +37643437303033643731396632306134376638633261366362623530626232306365396233313637 +32633164616131313962343436323335323833643435323837386334643830663934303334626137 +33353637396564646639633131383563646161343830316466353534353831666436353265346262 +65363633646439383139383036623664363433393131336366393962343338626664353032373664 +66316530666634303464656565363039653265613866623863366233383365343234356236613431 +64383431343063303665306435323538383034646462306264663734353335346263613134343337 +36623664333734366666333433623865643438373032613538636331326437643132363137353637 +62313330663233386465633638336162353435313839396531336564323636353035626563333864 +64383065356139303762666431666631396462333939633532333665353631633336643635663437 +36346663663036303039353637346465646232346133613034653563393766663636633230356666 +32656633383566363238356136636661643537313765623639616361666339333865633830303635 +36633631316366653539666664636465626530616365346538633132303964613031376266363165 +35623637323930616439393164326662373538333834666139656363623538343832663938613937 +32626233373032373937343031343230313138313932653131356238306266346466613563646131 +37633035313462376230383934616563613132323135633866303630333562343731613262396662 +38363661303663653062396466666464326361613635363561306332653635343733616438343233 +62623165616336373532616639636330636530353032333161303635333435643932326664393034 +30396566303931623435356264653138303337643563363261653363373866386131643161356263 +63653338636662383963323638303264663533646162636563323831636265653136393133393063 +61373139313536653130656534343339343164353939313564353537323666356266393965306463 +33633066366439393237363234353663666664343763323234643365653466633466653536373433 +35373333653962613630393933306338656365646538386435366563643538653636353232663936 +66363437313039663166343233313539306130306430636461653764386537633063356438346139 +31376563353835666665343932376232393761303565303032613437326466336431343562663034 +64346264633962373135623133313961616263666330396463666130636363353338323939633365 +36383765386532376465643336323161363530393836623038376233366239613064626635616562 +38386634373666303363323233383465333561333162373534633964343132656262393861646339 +33343238336161316564303162653639373432663562653235656461643663383339626230386261 +36643636343930376336613033313462373736363761663865616134373937326139383630626531 +31336365613765613034633733356130343439623264373666386239393736393434346532363331 +34316236373161653430306538613432653335373764326263643539663937646564643439353863 +63653333626133663835306235633132363864373162363939313233363638656134373131366666 +39303731366264373736393230373839643162303663396331326262393330333965393665366232 +65313338303364626439653636313736346234386230316566656662633364633763616232316534 +32396636363238363335623636626235386465356266393632356562656161333238313432656564 +64653939376365653339333864616239636131393338393334666339666164346666326161626165 +39333262343363383062666161656635373833313039636234633264336132363732616439613564 +62633237393237616633626639333831343831323035356665393236633161333339316234306339 +66646438633462383930613233353931316538393532333037316534393261396439636464646238 +30393933636164656638353864303065653633363831623739343236663366626135383837633235 +38613439326135386536306537626132386438386339613436633934373239356637643936646364 +30366639386330376337626633633866353933343932623264303463386635353937363136383436 +38636337363361383233376339326462633336633336643834313536363765383164353539383036 +39653730363766323938313364643666333838396338653661663963643933643531643666343061 +62373239646333653661643435323131636538656132366434343739343563396239313239343866 +62356464663137333334633637353562386538333534666264333463663164323262393438316336 +63653633366564306530363239643264316161316234336462666265363861316130396335396465 +62643363653366626334616166663735326230393439646466373034353837366465306131653539 +36663362313361636264373264373138633462613339316366633939636336666437643961363534 +38316164626234656133356362656266626533313531666532373939363230323934383264303934 +63386139373263373737313838663730346464656437303262633462373566643738303361366439 +37663735336437363736643339386565393634653763653638393137306632356462363464646132 +39336530663136656534343161333863356563643436613065343433366130313736333663663831 +65386462623534386265383862363266653132653735356535306461373635303639643631313934 +61383937336235636333316561633939363263623864386336323038366237303464636138616263 +62643832383635343337346261656638653264643036313636356432313133393164373334333731 +35383162663032326433373539323066623739393230646262343031623733373665643162663135 +61396439666131386437383330356236306333366433393165613765313734313564386264326230 +31363839343163656232306231333538383330353061666430613862663565366339623661363331 +32666163393534303536656365346339346633316532616261376661653736383133303538323534 +30336536623934396334666532626339313534616661313736373164613861646234303965613062 +65373236396364363539396466386338613231363931363964643632633062366664656262633933 +36353830653765383734656161623631373761613064363332636439643833663237326466633563 +64303265383061343633383462636139373036363162366435666230346431633037666436363137 +65666162343963393838383236633038646534666130333362633530663533366231356337313731 +66306361663062376362353132663939306431353464303336336333303834613037393664316666 +35623762663033373735386235663265653065383734643130343965366537646566343632306531 +32366437633464633435393536353461623634653563316332643936623837373863343265383764 +65636333633266653537346530383737366165366639343562653538383463623234643839333266 +31623161326633363964303235646135363634626163303835313738303035616532333362353131 +31613864653130343932383864386133333539656563643335393662343537303462616164333034 +39646136356563323966336533616335633763356631623061383038316263373665346663613462 +30316566623362646331346238343839343339303765333361303832643063653139396535653862 +39396234316235646237323661666663306463323435626637363365343932313766663262633932 +63306330633366306163366537386461633634383632373965386562666563323561623565653461 +66643332376539333763626666323262306535633262623635353638363538376631393832643438 +37643865386635656435333662323261366631643131303234306234623336393633383235383432 +64656331626236656638393062616662363464393232616564623331613764316637363431663734 +61353164616537386635336163306363303935343631376539373535666463623137343833326631 +34623936333161353166383466663334393430393039633664343766633366396130613864363931 +64383834323539376566613565636337613536326534613862306461346232336532303766386161 +64623862316237336538646266633336613163386562663161356339626361346436333565643238 +63373231343733353436313965313961313132323235336134313637333265363531333137613130 +34656432646665326333623938613630626466313665386565396332613334313563323035333838 +30653564383865613537323839633539313933376330303233396635643033353664323564303364 +37623561646330323835323637613164393162626337653236623333366631326432386432316335 +37363532343235663832653733393732333661633337303436643137363237616438633165383563 +32616465396232323332613835343134383732326266626135633430646338383330326135333733 +32386261636461326661643032633033653630323733613166323762376565343239613935363466 +39323764313934633432363933386237373763663332666563663266363434386236373333393739 +31643634313464366430363232333366303537633737323430393930623062616262393765303333 +34353432666661646539386636303836376430616562653538383064353437363336316338333561 +34656562363362656239636461363165366161653534376565313934316639326536633832333033 +34643262386138383138613933646362373836326335663861623862636466623066663233336365 +37323865373064346435363234663932623736643439623532396133656365396363333935633335 +32653130326461353036353532333135393066356630633039303538623466656135663331336261 +38663434656161663338386166613937656430386437343966343965613862623639616163376332 +37313838656162306139373739323064343362343463323031633863336263653433653539316662 +36626264343135626562396136626164623466653635386563356134646361323761326634396434 +35616137343266626266333630313630353431656539393532663837366436313834326461303766 +64366235623561366363656138633662316366323361376665376566333735613762393065613462 +30623933643366343036366164613634636163323035626165336636393463313033356434666539 +64363937653964656431366365313930626663366531366237386339636236613133353039316338 +62646563303165323130653262303135646366623731316132323336323563653733363239616164 +35376631343332383863653634363237656163386535383336383863623133303965653437643165 +35373638333263333964333566363065643764633430666535623964376461646664313862643433 +61613736623532663266343462323333663863356637616336336236336534653861616538616335 +64316661363631636132623266316266386637393336376264656233326134666336633266316138 +36636166646532333231663835666439613734666438646337373438626361383565303535313439 +36643766313563613934303765653438653836366363653265663339636664653832383437666366 +35636230646565343030326665306566313631626238653966383861336537616336303639663332 +65383864663266323632386661623839626333333135383234376230613935376666636163623462 +65303838323763613534333331366461336137353663346232353835323932393932336362643262 +39346664613138386339313738626664633739323836646239353935396661643964396634643638 +37643037623865366630326138663561323636386637616339303237393330663536303930666363 +36376134346365323832316331306165353662653030623134333838643635373766333963326435 +32363732376664623131326439333133313230616330616561316236653330393931393234303238 +30386234646462633334346239353661346534336536323065326263623666656334333337333261 +35643438303764343566613335663835313339653466326130613432313935303430653164386538 +34666339383236393031303964373336353864393666663265336561353761386239383965343063 +33643734343864313836343434656262626561666565653162323334636239346538306563306366 +37303666613437383066313866633130313833363864633664623632363932353962333937333732 +64336133353662393638336438303262396562326231386362396465313939303236626537643836 +66363763653762383833376437643564306435663236306536383035613264633433626135353364 +33383639306364343962663265666134623837343338326266383337373334313537303061616663 +65313264386139663361393231373437653839383662343139613930333466326631373566653863 +37393030623134306637393435653430653564343434393037323539303461323862373930646333 +64313033363230636265623066303931383865386662613561393136383766313538643761313364 +61623161346232306434646465333832336166316366333937663463636662363239616265613661 +32393865323966613131356132613663396462653539306361663461353632613961343163623033 +63376161643733616366326232633466363733343832373238303736613831366338336563353836 +62616635396264306339663764396165333430316363616630646362323631666662386531363932 +37363836343039376131656539303239656363383331666561396434313739393937323531326565 +66326562303666313032333838346334633030383035336539653836663435663838326161353533 +63366335623633306439666363343235323637333466343837313138333235666434373466613139 +37663332343931656566643562386333383163316134303762313137303937303764623763346235 +36653737366630333734653530613238376566393136303438316466356135653664373662333931 +39343536623734626338666465363933636136613266356132653535316135363132386230326637 +36346433383864346464643733646535616662333862393136613639396666303633353536363763 +33356532313837666436326332393230393434363832306565346563363466333136393662303061 +30626364636464323339393739666663626436646166356463346231646462346638336538313561 +64613533626237363839633937396263353233623064626434613164373430333333393437353563 +64383639643334656332363035353063643462356233353738376233386337323766373161343861 +63306235343130643861303362626631386566353037653038303237396466356566623530316639 +38323534663333633333383632613066333065663738343333643766633137383463646538646261 +32653232616236383035363265613832636662356266653764613964373638343931383334363063 +38323363306334386566633566323534653830323366653261646636333233616636633639646565 +37666664353139396263326231343339303433666433366631303164343636656462346135346436 +32363939386663656265616635376639663233323930663238383230343463333565306235653137 +34643333636236393438316331386133363865616261306333636630613263383538616437393762 +33326335643462353764313837393337366361653366333630323136336330623630636630343031 +65663839363137626433363639666330396364323739303938643839366239363135636639383737 +61366263613566303635623737633836636561363636393538363566326631303030373831363931 +66333332343362383130663165353464396639386561386662626464663162646564373530636136 +36316233393566643534356262653536393537643633366464656138386561356533633965613265 +34316339386638366532336137333163376137653531386463343561643633333738636334653933 +36333639316664393261636462376337356463333530623332653464623739376332313435396236 +33373234636131663234303934343863653434633265313762626238653565396262616634316431 +62643861663561626266613237623033666662313632633130373463613034373830623764633035 +38356463646334346364613866633166346532653435366262663366336566376536346162623835 +62633837633961373731306462336462363661663232356664303664333733366562333939386638 +32643533666531393832663463626635396638643732366636613031353363306232653834366139 +39636561333363633132373661386466333332613131396664616431313864313036323036333364 +61633864663439353032373139663239326438323734646333616365366664633763303731313036 +38663635623263313966363533353132336430326263306462623930333361633237663334633162 +37396131303661376339623239663061303632323236616631396333656332616663353664336633 +33616361386333636434383762616439373938326233313834386437656439303330333965303435 +38363739303334316362303938623734646665663333643565333939666233383439383032636566 +63646161613436623463353536313062343939636537383936636636626166313761643162383938 +30353935643163363836656131383265666438316566646264633462383039653538333238613630 +64383135666630383530393166333438396536323765383830653336393230343561343033616666 +37373634376530333965613736613562633336373534316331333137633338323930383937626231 +36323632306134383137383836363562316665323766386164633738383437356261316664653063 +35376132386237303734333937613235376534393665633964313566393332353662346363323565 +38333332323238326634623231666465386239356630306237633762343838346633613939303035 +39393330353162616462393533386662303035323265633439316537653562396261366366366562 +33356439636363363064323238343631363337373132303338303339313739343063303266653630 +33333764383563306330623737366464306433666530646132373163613939383435663335336438 +64393631393530613734376235396232333334636339303532333662613336333730633037386331 +65643837613431326162386461313164666563306363353831386431663337383232306235633935 +30356332656135653732343737356434306531356662303534656534643530376566316136393933 +38303433666439666230616337333566313534373731353738393762613365383330613335376133 +64313638313134663135353738656133646136636237306463316162356564393835313762323566 +61363835306132303233653831386537643136616264303936386333373763326665646537663637 +33663461306266316262646130323632363634623963323138353463626533663333393831373633 +61613337376130613933626365306534366432353838616639383164623232323338633839653031 +64373331303436633761646133626466616661393336363734636538653238663734316166363366 +66343833326262333462383331356365373764646163303863613838653561303235643763343933 +39366432336633666564636433366531353635333735616131323538623730346239366565333764 +34616231636539386236656461323261643632316336386230306431623439353832353563373635 +35633161306336346162363363323732346632643834386634316136316230323565346539313030 +64613434626664386133303863393566366261313532316532393166653438333466326139626634 +65623039323731303535323162616132666131316230643032636233323634353335346266656566 +61653930303736363033313264353765613638646265396430333063646163636263303736613533 +35383235336338353063346633643437396434393263623062663365633465313131623965666135 +39643966633762383163623562306230636535666433363431353030636331363865363731313964 +36353139656361616261313337616365633036343534633037393066663730643230643438373964 +30393732623834626430366339336265343764343436343964383230643531343636346636346338 +31373632323738336134326136633837623538306165313266393238386535623564363161303164 +35656163366664343965613437626133623834383833663763353766306230653562656634623931 +61613436653732653132323637316236613235363864643762323933303363303333326161303061 +64366233396131343230653065363738633965396639376130383863353234363538633364343661 +37643732636537636336646335313534323732613266633364386533393438346135636132366532 +37363464653564633864326130633631613834376230306132633465363064333764376462666130 +30336361656363343134343333626234393163316362333665356165666330353031623238313861 +31343039353336623934663937336663343031613265336434333030353363326565323136333938 +32386562393465396565356665323536616535383233346565646366666533653134376135396163 +34623261353137613663363665383532623432656130626532373339383166646532343932336234 +66613166303138356233306535373761323461356563663732363035386263366463353066643466 +61313832323038356637643861633331313330626136383865373465383164353664653539343935 +39373034343736353635666336363561346339393133646137363062633364353863666564323237 +32613536323935333535333765383635326565386238313836623739636462323134636435373931 +64616638613037643464343137396630616133616335303362646561396561623065386264613830 +34383366396535356261383830336563353236613134353764373636633636643736366639333664 +38363637363565333730643433393837343431323766346539383131643565356465326539663733 +66623162306131346563336462306564303933643131623433316562373336383432303261343735 +30656238313364343364666438643934353666636538626235356631356162653861383836343564 +61373064356636323463626432626261396466323532633938346536323162326332363261323566 +39313437613136656331373466656239323533636439303132353538303665346630613163393761 +36303136356363613361666331303738373164306365363132666433366231373033326634333935 +61633837646339626132396637383736393864356131373835656564323936313536626661373332 +63663361343533656263613638383161373332643465333330386135336536616433626461353462 +65613365613034343164633838336233353765623730363135613662643131333061656265366431 +34393366363765396135333537376234363161363165663331363431306364373161333862313231 +30663465386138393833646335383563303236616430363863303932383137616533316234306361 +33313263633761613835333030356464316537353062353162626238376165353738663936343235 +35356438373635306335313832363039393832633038373564643430303663373335313631383430 +34353034313838346630326664656538316639633935353838636265663136383036363232393166 +30616532396136633964396363633663343334343531393666363238633439306631353138623661 +31396232663736316138336664666364633133353430336532666531316465623934633338306138 +37643163326464303061643564356233366235366563313061353533343630646138646663326230 +35343435343339623835323432363764333531366335373635373335616465353162383836363866 +65663562626664646334643837353863663132393930353866306538633139336630393436666335 +64393262373137623462306138363531343065306634656337306263386464303461623837633839 +37323639396434343630326634316435376464663837363731666635356131366134643734393235 +33666535656133306631356363383337613637303463623438613762346464373736396538646138 +62376263346563343365663534356437323933666565386364373339306564646633656361373534 +36376535353565366631363239306537623130633332393863613437643637316134376334353661 +34636333613366626565303637383235643437663761393031653736623134333930383566373630 +63343162376239373966656130636464653335653030353665656538386663373133376531656662 +33653530316234623430353832346631323636323732333362373939373230653765366364663063 +31623665363433666337663032326665656365636639356565643235363931396164653430353735 +30653237326563353565393932356439373433303531393062343865653863336130346365656262 +39393730656539343733616632383633643862393839326437663636316464623964346265386561 +37393835393561643363333964663039623531663338636162656533343934613632356133646536 +62376634653336626663373461303032353935313233663536643938366231396536656331353836 +32353364313262363033666666636265616532633835666363376536363265303062316632313333 +30313633663463616539353039353861343664636532316533323663393230316438373333313633 +37623564633930643530366636373062316432366138326430396537373939613833343332313237 +31373865633761653335313666383539373831366236313036396438373764336665373661373735 +34336137366637633230363264366261623535643030653936396562636563383466343832386361 +39373532636664316564376366313263613763393639396634363963386334666534373363623531 +31366533343433373737343130643861346235313034316664353934623763383962393635333133 +35376135383434383737623432373566623533613134653630386361316265643637383166623838 +33396639313130656439383733363764376435313338663139363539626631663038353964383965 +61393836303736343631633864663732386362303662643163386536366164363636303932363065 +63323433326539633230623832353732336630336136636335653230313231313261336432343034 +63333933613861343263376463366563636132336161346433346262386364376562386438346535 +39313261653538393932353333616161333232623664373439323031643265616162366466393936 +64623433343632653966636537393464373539643835346364353330653931663135636332613337 +65356532393736356465363565336635353366386238636166653965366131323338613862393461 +38643539336264333939613230643136653765626163323737616631656133643666386437666337 +35643132326664313632313962633161393562333539366461333030376535303631633466313132 +39633438376562643531396130363536343964643335346465303463636437663433303463323662 +33616361353532316434623033313566636631656463333265666330366234656162343231646338 +31626366373466663936613139666231326663383666633164376637333633373532343435323331 +61646231373233346236396565613362633765346430623666633434343964623662656463643262 +66613334316239613265366465623730303239653838363561316139376437623336306232383162 +31613935313337653236393234633033323266626565616337383561333030366663383036353761 +30336132656436333534666332313966366563323664613163383037653836346235643537333232 +64653636333238623034643331313761336330333532383135383866333865333265626164643565 +39313164336261323638613364613339663966666566316136636434383166643861373539616136 +62656330646430353764316366633964353864666662316536343932323034353730363463323330 +39366262663161386461343766376565316434383631386264386662626133393362353437326337 +39666133663434303132323036346231376239633365373739363335353438336661633538353138 +36636335376439613761306533636564303735623234626361303535396631663266623331313231 +32346133343363333534613438613238393337653366303430633532323833626332343139353366 +32616562633130353732323033356564623437386330333164396632376362306336323530383061 +39633630343739653833653261363332353535396231393138346431316232626565326330356463 +32376333386131646161636334323435663865633932643966353835373233383762313166386562 +37616532333631346633636633633365666461366364393237356561653230326263356235656161 +62323862303234383035636665333563363736303762326534353565336161626431303131306561 +31316466373662313032376539303938323062386234323138353236396532386532663264373563 +66333433616266323033383637623531646337623233366565633066386361326134643730353736 +39663230316266316261346435653639333438616335323564633738666639653561393563373931 +61636332643130653439336364333635393537663535393561383764646333303430396663646339 +37363366316634363630613662353235373564656637326231383733343331343436623132653730 +33346238323131633431333664343738333565356639336531333132653734326537366432303037 +35393964653262353830333862646537396466373636316134653931303835663965653230363533 +32633266336665346638623232643932333535393563613839356130613664656436316335383233 +62303862363533623934666361346333613166356434366533383563396330343531316134363866 +31313161333665633837653038616366396339383337393464663635333633353164356662393765 +35376165303033336230346336656162666430366138363830653164636530346466363637353934 +64303633613536393431393938346432626132653331356633653537306665313136613464633832 +32656366386630376261626237346164613030616364616439346364623838373262316339386330 +33366261373330613535363062393438656265326639633162636562353339636332336334393761 +33613531303432323033313731323032373165353737653830663665396431363365633836386138 +33366134386531313332613434616663656532643330386461656631313432326235626465333664 +39316262636131386138313763643436376336663164623864353339383638383961616432663864 +61373330373037633965383439646335663365613265626466633532316264356563653234626566 +30386331646230373339366637633439303933636635376330333831333337373539636134666161 +37613765646365393434326137303330396139336337653239383937623835373839346537366137 +32386638376636383162656438316434303565643433666266346537643135646239393839313038 +37343133663830373166633833633463366536356361653433393032333661373532363562393163 +38313933616364636637323430346235656632623738366231646464383033333333323566653838 +62633931343964613865316666666535643939323431373065393631383030323334396431656265 +38636463336239343562393266343963363031623266326133653963376334663239633139353932 +38336336373464383434313231643133303262636462663665613535353931336236306666326233 +38663235326362373839386630386661653139383138346532633538393561306334356632643637 +61383433336437633164333732366364646138343661633433306630636162343339346137343838 +37636335366333656461353434386238363066613333663734376631343731346137333333633764 +30616532343364396665656432373964363165613131376434343630653634326632366433633233 +32623530346537393334343336323636623561396566353037623434636438363137646631353066 +34373037653561663938653430326238646666616137336533353839646332633161646633313731 +37323333303339616562663334396464356637333730333338666132323264376132323534616162 +30353637653031323163303336323336666236383434353839323065383139356634343539343435 +64346435636461353262393834333830613831643632316430616362663466613737373030376134 +30356563323033383264626164336165313361356463303166613134376333336635613661653035 +62613938393434623662653239633162623830396634666561333964666565383931363134646239 +65336164366166646561346365653933366332653633396366663839316365643839353033663237 +30623738343062633434356133343263376132663937653964623233373336326264663235366664 +36386563353332303637623838396130663236383464313032353538663961343362323137376437 +35393137373265306164396366626666376532643165613632616265666666646534363664653061 +34343830326434316532373933323862623365653266613261633538373965623265626538396161 +37393736373338346230366564383763663137363733623333363236343536633739623430326261 +33343337343839376434636232313862633966333937643766373331623061386662356431393739 +66343737646266363565653431346333336264313338613333373134396365396339663766383662 +33633164326461336664633934343330336561613531653337636133663737313661663536303266 +65363739626233373438646562393935616534613737663331626335613562363236626137616563 +37666339663133663666636161653263633263343836623861306133373466386435326663336333 +32373334336530333961626663323166393663373635666230336339386664333163323965333632 +32633930373461663365363832366366373335653366336362373136636639376165656230356635 +37363139666666363364646331353335363962383461666265373136336564656633316364383638 +65326336313665363935643432326336316161663866646466643432313561326162626531366532 +30646565626535643933666235623531353535373662636636346136383332323662643663663338 +31623937343633326633333739363661373530366639613932333837333638316231373532303063 +64636664356538643363633231653165306336633730366635643732336638613833323061353163 +33343839313163656464396465623935316464363164613530653233363631626561646434633137 +38356537623065613133326133613134353032613764353133653665353038626363376139306333 +35613262643030613664356231386666363338623061393861326134633839356362613264383238 +33316334346431316334343662633034353837656365353439323766383863666435393962306166 +34656162373035663132336564613061666361356236373663356662653563323939343233363530 +35633861343234393535343038663563646532653562663035346231636635326136353438663633 +62653562313432616566626133353562616163313938616166643534643363316130373061643932 +39343132326636646230656637303037356638386231353934383865643263336632643638353233 +30663132616164333537653636653634376538306333383362613466646165306637383737636363 +38643663653132393139373837613466633137626265363463633864393431636339376330313932 +61626665343961316438633162386535373861386636303231333230316261363462343262316663 +37616265363230623035396461323038356339616135663531363030353564343330343264393266 +64326466323761376631343838633735653631363366616366633435646166326639643539386665 +37636362376136623466333666383539313334393435393464633238656534626162313763316435 +62353066623765623630616639646462666331633139336535363935386538316235313535376363 +31373437356230373761646531623162356564363039663763626164386538666666343235376634 +61613839396263653135363363386364613736383239313664373630323231353034666364343632 +32313030363662306439343233346132326563323264313464623439333666396332376635393965 +33366262343063313036306235396561366636393764396564323931626430623766353337653166 +35363961386535386534306236623137366366353838386664353938333336316130386263616266 +34643936316561303361313361363935303231333635643333616534303934366564653664313032 +34616535303230616665363632656337306363386533333763323464396335643931363339303633 +63663865313663646164613330346636633365653536663265366332326631363730343632633563 +65306236323833373662393731336634643963313736373732333137616366616437623431316632 +39626339303237613535633764343838306665313936333134373334643436323532643632663830 +36313563326463653538336136616461636165663962336539353965373166396335383438373237 +37366432343364306466366632313739393731306434623535643738393038313338663165643465 +62626536343664353764643132646465663664623634316535396362366535396264363461353231 +39656565316136383063303536326366306437356234346462666136323864363138383639326432 +65303463316563343334333133623461333038366534333036303666616234346431306565323433 +36323063333362643131623738363239323038636364366361343766393832626436313438623733 +38663633336363396435636262613165626639626230343861366436303636366238623933633963 +62643862623439623464343239373061613130656131666566346237383839626638356135396662 +37333834326438356538626336313930633562373238633337623761646531373365346132316238 +34343862323432393233636338366165336163623564633236393664633861333433653061663930 +65356434613762386437643637336533666466393762346530663362343233323239626236303839 +62343636656431303733373439343935373039343934643538623265346133303637653739616166 +62346362646663313161616232663261653061373366643038383265333665383266393036303665 +36343334373838343362306237643432613833306365333163666434373030313163653236353038 +62393133656561363937303066343066323665313533336337326530636234316130353866393031 +61376437353066343665303036643063623166653638316136623732303735393730616432666238 +37333766313837653133386566613531366461316262336235393831633434343537396434373466 +37653238323637656535613039313666306663373439393764633062623030303836666635643136 +64363637343633333066633635383663646635623835613930313636383832373631383031323062 +61353066336664353733323336616236373031386131616535333166656134653963343933633761 +61373561333639376163396266383564653731343330313131383866306232366333393165613565 +61356332633337346336333663643131343237623735366339616435343163333934393964353963 +65313436323730306561613430323565653065316135356438643337393738303532613364626237 +36383837346537396134316435613264393434633864343934396333623062366464633531633134 +31613531616433646135393336626266326662343232333036653534643932303632656231616163 +36636237616437346631633038383961363434666562646366663861616263633763383037346563 +33333863343865383031653130373830383562643134356632633363303666646331396135383434 +61363533343333323635316136623833623865643732386238653264363165363762306261333537 +32346237313862393263356636353739366431336238386539353664623235376163343162666530 +39386262353331393766373964633131383366343232656237613936323064623737616132643562 +39323831316630663364363265383462643935663564363232616565313764636133383066653263 +34333732316431353161316662633736356538353136626535656266626562373535666237333563 +39373434636431343166353039383633386435636134386166303430646562663138393434646366 +36363663333938633338333639663563616465656137376364653563663966373462313438366537 +62633139356431653333656331353338623366303835333337333566646463306462303465313331 +62376461373464623834613537353931346530663466333165613231643163366366613835376362 +32363262383932303632616435633632633364363537646263336331333436366466343765656462 +32393833336139643261373831343763383666306337663937363763353636663937383239633839 +64636162363366656538303633653562323333346438303438393964653866623830663335306265 +32383966663033613837623832316431643030656262663331643631323764656661663834346437 +64393664396562346564343638363933613835323333343136373636663965666538383838326639 +65386664646666356163653865313837376661636263383338326635396430653135376331346362 +34313564343063623039333965393137373839626166663332353237396133343938376435656565 +63393366396633383337303938663165643235363537316136613732323066666239373338643030 +32336363656338383365363139643334303661663861333361653634313938643232663066323933 +66343966376462383436346266393138343463656132626637643366346431316364636330356464 +33353730373936643664396430336662356536303863613566656631616531656434663433346138 +31383164353235666462333539323438646631373061323234633935663563383634303330393632 +66626236333463353061613737366332356438623334623134643336393739316531653233303237 +63336437623263356338356133303431626361323735363064653735343532356465363839626165 +31646161313330636532623461633732373763363931353331666465633862353731393038643639 +36343161613536623239653564313961613837636231376132646333386238353531383866353864 +31386137626364376231373633623136633764383862343365343331663461623965346264306365 +61646332313037613134313637303031373538373736323437313337646238363337333536393530 +30376561383130303936353639393533356166626163366265386463376230323830616431303966 +39336633356237383162636666326335616431363630643732376436353039613864393063363038 +65636135666631336530643665306535333832633132383964386130653163396239616533633839 +30323635373636313637623339656461323536616465313136303530626366343462393339353763 +38306464393332373038336261326435326463363837346233613831333731336663623636353737 +35343764666634333330303737636335666462323264396465363634386530323364663036393030 +37303565343265613331633932353634643463626365333365656165323433616431323834346363 +61626334616532306137336630653130623530393936366463656634616532333231323664643366 +30393735356263393366323931323133343061646437616639376465393634653134643739353730 +64656231636666326334366465356338333266633034303736323832616664666537393332653161 +32353332393566633130376139366261353238303863323535306261323239326465346264306235 +62356539663263336562626430366531393334323461333565306535313964646235663132653031 +38343231336562373862383265393133646364363532373361343937613965313233383235326337 +39323966363461353662623338353163333862366661636336383130643838313064346665646132 +32303034313634626261656264383731633030356136383764383037343264303663346464353736 +66386533366332366461313062393565393765333331636633383161346231323035616235633165 +62343364346138643061663339616561616437393235376662613164613661376463326337333563 +39356164616538316538316439623135653265373234303337323330333730363866353237623134 +34386438366531353266303865643337353337653537396133323531343232366635613839623934 +34333130633334326363633337386664396234333363366564636234353939373631663566333566 +65626165613830663965666237613632323961346231396337343037323365376237316365396634 +61643636303232616433333366356661333536623738636531393537353533333461626339623462 +64353735353865313833653530393434643163653732626364396532313431343233636234313235 +36666165353831643637666430366633306365636232323630396134323539393936613139323238 +36396639663135363232623332326262653535353161336236653964336361663061663461386238 +35393033653139613935393530306530633636396638343830376433356336323763343061353865 +34653134383863356266373031636266366430666231333630653563396263396365636536633065 +6463306132633738303536373762646235306164346437663933 diff --git a/k8s/roles/fider/files/config/base.env b/k8s/roles/fider/files/config/base.env new file mode 100644 index 0000000..73ce8e2 --- /dev/null +++ b/k8s/roles/fider/files/config/base.env @@ -0,0 +1,21 @@ +HOST_DOMAIN=fider.icb4dc0.de +LOG_SQL="false" +LOG_STRUCTURED="true" +LOG_LEVEL="DEBUG" + +# Metrics +METRICS_ENABLED=true +METRICS_PORT=4000 + +HOST_MODE=multi + +# SMTP setup +EMAIL_SMTP_HOST=smtp.gmail.com +EMAIL_SMTP_PORT="587" +EMAIL_SMTP_ENABLE_STARTTLS='true' + +# Blog storage +BLOB_STORAGE=s3 +BLOB_STORAGE_S3_REGION=us-east-1 +BLOB_STORAGE_S3_ENDPOINT_URL=http://minio.minio.svc.cluster.local:9000 +BLOB_STORAGE_S3_BUCKET=fider diff --git a/k8s/roles/fider/files/kustomization.yaml b/k8s/roles/fider/files/kustomization.yaml new file mode 100644 index 0000000..d3feb8b --- /dev/null +++ b/k8s/roles/fider/files/kustomization.yaml @@ -0,0 +1,18 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: fider + +commonLabels: + app.kubernetes.io/instance: icb4dc0de-feedback + app.kubernetes.io/managed-by: kustomize + +resources: + - "resources/deployment.yaml" + - "resources/service.yaml" + - "resources/ingress.yaml" + +secretGenerator: + - name: fider-base-config + envs: + - "config/base.env" diff --git a/k8s/roles/fider/files/resources/deployment.yaml b/k8s/roles/fider/files/resources/deployment.yaml new file mode 100644 index 0000000..d48b6d1 --- /dev/null +++ b/k8s/roles/fider/files/resources/deployment.yaml @@ -0,0 +1,34 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: fider +spec: + replicas: 2 + selector: + matchLabels: + app.kubernetes.io/name: fider + template: + metadata: + labels: + app.kubernetes.io/name: fider + spec: + containers: + - name: fider + image: docker.io/getfider/fider:stable + ports: + - containerPort: 3000 + protocol: TCP + name: web + envFrom: + - secretRef: + name: fider-base-config + - secretRef: + name: fider-secret-config + resources: + limits: + cpu: 200m + memory: 200Mi + requests: + cpu: 50m + memory: 50Mi diff --git a/k8s/roles/fider/files/resources/ingress.yaml b/k8s/roles/fider/files/resources/ingress.yaml new file mode 100644 index 0000000..77d8259 --- /dev/null +++ b/k8s/roles/fider/files/resources/ingress.yaml @@ -0,0 +1,47 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: fider +spec: + rules: + - host: fider.icb4dc0.de + http: + paths: + - pathType: Prefix + path: / + backend: + service: + name: fider + port: + number: 3000 + - host: login.fider.icb4dc0.de + http: + paths: + - pathType: Prefix + path: / + backend: + service: + name: fider + port: + number: 3000 + - host: community.buildr.icb4dc0.de + http: + paths: + - pathType: Prefix + path: / + backend: + service: + name: fider + port: + number: 3000 + - host: community.inetmock.icb4dc0.de + http: + paths: + - pathType: Prefix + path: / + backend: + service: + name: fider + port: + number: 3000 \ No newline at end of file diff --git a/k8s/roles/fider/files/resources/service.yaml b/k8s/roles/fider/files/resources/service.yaml new file mode 100644 index 0000000..7002a0c --- /dev/null +++ b/k8s/roles/fider/files/resources/service.yaml @@ -0,0 +1,12 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: fider +spec: + selector: + app.kubernetes.io/name: fider + ports: + - protocol: TCP + port: 3000 + targetPort: 3000 \ No newline at end of file diff --git a/k8s/roles/fider/tasks/main.yml b/k8s/roles/fider/tasks/main.yml new file mode 100644 index 0000000..d718f21 --- /dev/null +++ b/k8s/roles/fider/tasks/main.yml @@ -0,0 +1,45 @@ +--- +- name: Create fider namespace + kubernetes.core.k8s: + name: fider + api_version: v1 + kind: Namespace + state: present + definition: + metadata: + labels: + prometheus: default + + +- name: Create Fider secrets + kubernetes.core.k8s: + state: present + definition: + apiVersion: v1 + kind: Secret + metadata: + name: fider-secret-config + namespace: fider + data: + # Connection string to the PostgreSQL database + DATABASE_URL: "{{ 'postgres://%s:%s@postgres-15-postgresql.postgres.svc.cluster.local:5432/fider?sslmode=disable' | format(fider.db.user, fider.db.password) | b64encode }}" + + # SMTP credentials + EMAIL_NOREPLY: "{{ fider.smtp.user | b64encode }}" + EMAIL_SMTP_USERNAME: "{{ fider.smtp.user | b64encode }}" + EMAIL_SMTP_PASSWORD: "{{ fider.smtp.password | b64encode }}" + + # JWT secret key + JWT_SECRET: "{{ fider.jwt.secret | b64encode }}" + + # OAuth + OAUTH_GITHUB_CLIENTID: "{{ fider.github.clientId | b64encode }}" + OAUTH_GITHUB_SECRET: "{{ fider.github.clientSecret | b64encode }}" + + # Blob storage + BLOB_STORAGE_S3_ACCESS_KEY_ID: "{{ minio.rootUser | b64encode }}" + BLOB_STORAGE_S3_SECRET_ACCESS_KEY: "{{ minio.rootPassword | b64encode }}" + +- name: Create kubernetes resources for lookup output + k8s: + definition: "{{ lookup('kubernetes.core.kustomize', dir=([role_path, 'files'] | path_join)) }}" \ No newline at end of file diff --git a/k8s/roles/gitea/tasks/main.yml b/k8s/roles/gitea/tasks/main.yml index c46754e..4a92616 100644 --- a/k8s/roles/gitea/tasks/main.yml +++ b/k8s/roles/gitea/tasks/main.yml @@ -1,15 +1,4 @@ --- -- name: Create gitea namespace - kubernetes.core.k8s: - name: gitea - api_version: v1 - kind: Namespace - state: absent - definition: - metadata: - labels: - prometheus: default - - name: Create forgejo namespace kubernetes.core.k8s: name: forgejo diff --git a/k8s/roles/k3s/master/files/traefik.yaml b/k8s/roles/k3s/master/files/traefik.yaml index d1bc522..2a4c87e 100644 --- a/k8s/roles/k3s/master/files/traefik.yaml +++ b/k8s/roles/k3s/master/files/traefik.yaml @@ -11,6 +11,8 @@ spec: ports: web: nodePort: 32080 + forwardedHeaders: + insecure: true websecure: expose: false service: