diff --git a/inventory.yml b/inventory.yml
index 81076e7..f7c3172 100644
--- a/inventory.yml
+++ b/inventory.yml
@@ -1,649 +1,680 @@
$ANSIBLE_VAULT;1.1;AES256
-62386339393366643763383339373037363365316132633835363530353330653839303732353335
-6231343438366132343632383066386163336532373633330a626636643034633261373662313138
-37336632633465646638363763306436333566376133656237373731613539363530656266336339
-3339313039373766360a306631373166663330373233343762613631636432306333383265313639
-65656638306665313862316137383939393336303633646463316536646162323563383263623637
-39323134626333333661666636326636313263396663653864643262373733326535653764313065
-31656135313263313535386364623237376336616430303737306534333839326531383964636264
-36336164656636366431346434643536663361313634386233356132633133666237633037623439
-37356136383063356530336230373231623062306163646235633633623439346634636161623062
-30383438663361373938653630653562366436303235663963363631656630303165386465396632
-30313639633364633439346230666264363762646264396336663934346533353562636437316461
-39636665346565343437303032313761633536633266653866643235316464346533666536316664
-39346662373338356639613238626237353737363533396330653239373033393665663263353165
-36626265323266333337363365356538393933616266613965353662323263353832386264363337
-35656631656365366132303465306432366235363931386238633265656162396632656463316465
-66363734663233663866656263353631323762343665353535356561313237313036393138636163
-36386562333339373832383364373465323862616661343865646662626331646639646164313439
-30333239346136303432323035626135623937353862646562373336636134633034393837656164
-31373932323135353836646236316163343966643731343831333033386338393737303264626134
-63373862383732663462656639643335613232633839386434633832636534376133376432643638
-31353136313538376531613239373965303730323536393039633861393338323861306662313639
-36366636396364386136663865613564633566666262656538373637383133376333623934666262
-35373134633133383535353436613932333466383961313361333730303164353463633531356561
-34626335653335306435333364636235623862616266353961313138663032326338343665343035
-66393562373835656634326164643638623364333239613363333138303938616337623366346663
-37343662663239396666633038386636633963613934616461363664333631663663316531626266
-65636661306635333839393835363839383763343164616631666238373737666366323232346234
-32626630626564353433393463626566383331343365396336646239303462633665643439633538
-36383365356435626237663630353364396166653365653363663362663838376532666236316663
-31393565363962316632663463313063333331316564383031363939646361363837623037626630
-32393761353066316663316165666434313766653666653537326638353165346438663565323836
-62383434616266366336363537376166663261303834353531323835626463326132326432336338
-39316464373362646333663763663334363035393336366266356639393735373563616130343931
-36383862363162613161343836313737363663353763323831306561313931343835316565326661
-34383236626335316266646362333535626338303962363632373663653136383138336263393435
-34326638353762343132393537343166643630666433386538326634613862313831633361303732
-39363862306562313765303066663932636531343935383466363738373039306135646162613164
-39386464623439356635366666323433303235303866653962363932643964383432323064636334
-63356231623139663661353364666432323335613738346130343536343633396333373963636234
-33623734323966626532663030646362323765663661383364613734663066313363653566303965
-64313136336236346430663636656634653039626165613631636532323164323330333263646366
-65393337353136396533393961613738336366313138373432306263393362613735336137393763
-37623365616139613638623664333039346533646638353538346464633465663634373463653963
-31366632306437616435356339633561346237373833356565663139363534373037626566356339
-62363739653934636635386465353163346263353034343861656135336435393930663561396634
-38393335303633326330373066623135336530633032653537366631343961346639656539666231
-62326134333364313237373035363637636265343236383931303438356463366361363936633964
-36393865626137353064613336656637353039353061353532663230396462363431393636663239
-61346565663764363666393034633239613431626133656134393661393435333334633736623730
-37656334656131623038363761343863643966313730316330363061326336353839623833643635
-35653333663239363436326131663537613735616632616165316435666134613862643265383638
-64323637623364313564313730643766376138663436356530663236313133353161643336663163
-34353735386433363362393336366236303132376235303163363231396266306462643261643730
-64333938353166333664383865616262383935666531633466653832383237623566353738376137
-63393937656235336432343163313933303532646432663437383635386164303039386535393334
-32356462626633623036616531383636633533346537316132623438663365373966343831333061
-33613431383038623162656262333031386265613561646530653737363339383631303137306131
-65643961393138373137613637396465346432333266303838653935373061316532636466316439
-62343863626564656232316236373735303734623933353634643337653036353639643139383462
-36616134373065616162336235353564663735393332636166306133373336373139643466653262
-62373735303130376534343930303532316332313737656434666665346133383534343066623634
-39383332626337323061373530666137333133653237353131363261366664623363393864616436
-32356238343137336430386262633962626466623438323437376566663666623236333432316532
-37356138343132393362373266396631353138373639363062623135666631383966313761303635
-33366136303632303965353634626334653533633737313032383036303430656662636230336137
-65653163326631636437363436663163376465373566366665333635326437376438633665336335
-62623666363435396561346436383433633936383261383639326535623861626539653833633738
-35626462383733363162616239343261346239303964376163636433313663353831633838396561
-30333331363336663336333937306437643332643332333061366638313837383532373036653461
-38316233346532633266373438336563613835316634396664663738366138613039616338353666
-62396166643461623136656266663637343862633237643665386530656436393363313134383639
-62386139663035663363653763366139396632656639623065383466633939363433393339323664
-66316138383238313562396462633731323037366461616434333865643363653339656364633265
-33613234613766626461366430343663633864363536646664323230323338383130306633613165
-33336133363466323062363961316632643133303962646230316336623731616230353932316562
-66303565346534363030323763336562353061633230373230303465336562396463376464643637
-63333137666562363135303264316332323031326638343032313934626663373362613133646334
-61653130636266633034383538636236313033373334613336356533633936643933336365346133
-37626263623035646232663433333532623031623462386336383032653735333335633931363733
-37386435343331393133333937626431303330613261396237306262623563633632323936316535
-65353638396430373937393536333565363830303333373863313762343465613861383262393366
-30633261326638383538623662653839393130323539646165646439613039396135656161656532
-65313662613533336161306639663131666132313037393338303261636433646434633761376538
-62626135633733323063316230636534393334336634643330323037393566303838336137313165
-37636632656338383664323264636132653432346164323533323739623730343937633938353735
-62313035323830303964363665313235313066336330336231613833316138326234393331636166
-37383731613537333464303431663236393933656462623165356335623165616661373665326235
-30333162636437346465633031633734623366356466396262613139623262326631666638326635
-32373631633234323365386532396561613366643139613539323266653130333537643465396563
-35346638326265343564343733303535643230663238336535343937626463343537653666663030
-33663563653865376135666633396164373332326336313130336661633136613233356237666137
-65306431636535356531333566303065643065653963313763393066353630363135336365656333
-63636239336264613161656135303633636336646531323534623063333439626331613138363239
-64656262313936616161326564663632653037663430653635356533393134663331353130366235
-38366639623662663230343039353861626432663933633137313238633332353739396436373633
-37353236363164306130326662346230336135663861346532383139663362656365646430373038
-61353932363561656537633534393430363236383566343839646231343730633864613036643530
-36633534343164376466336161333833653136376664353661346436353233616430396230386437
-64393430623864646334623137343537656563313865323336643064643766633035653265316539
-62636434653931613337336337383066373235653335656161656438373165616561323765323931
-31353661373532626231656361623038626361366632663764333764663737363137333732613234
-62376437393637316663353739333935343866373164333364346165313632313639636139356535
-38343639646362636635346634363064386636623635663536366461373431343362653839383138
-34323737313832343963366536666234363439386337353838323233376464646362343737313665
-36643237316238616265313332303162383033323363396330303766313734353563353133316530
-62643032326237626433363932666164336161346532646634363564326432396637346665636637
-36623561633861396439623835376434653738623862613333643162343362613865323363363434
-32633638306438653638343239383137396530356564356338623330303661663630656639666461
-62313232343461633636336538326537323266666466646261633336393464306438653136613637
-34336133623361336563306462373963613336383265646637313139653765656433346238386231
-31646362353736646431303937633033386435316336323062346235323232383466313566636162
-61366430313335313161333163393164353530303938386435623830353962373831393235616531
-31656565633534666164303532633235306133616536646161393365616231383866326635376630
-38666363386232633865366533373630356139393030626230653834613230346664383734616336
-39653736633237303161306632333138646633356463373063663064396561613162663138366339
-33326235313165343866363234353336643934656363383464353036353138626638373362393263
-36326438303366623137383530393434353933326163356634333837653830363037316565626466
-36643339376262386430383530343934646361303831633863653765303530373765336531326535
-36646330366635366339303731376662623366636163353738646535363363326437623439336466
-39373861323738363734613032383136313335306462386436633962666139366165343263616338
-64306536393966613235376264383463313763383161343634336362393865373865383366313839
-65623761626166366437323234373130393237643963376235316535646166326663646335353036
-62366562386364343734313261363636636639633639663830666130613833383766316461613236
-37653030326661623838643861353339353562366537346535363065356235393963376331623064
-36316464626439353464393638373963326333373037333761663239343431626563313735363031
-33613663613038326465623462623565343963333064623464313039376332323935353736616262
-66646161623564316439666431393462633463633432643763636535326538356135663535383734
-30323063323361376165626436633632636234653062623337346562386338663733396532323331
-61316539393566306334616435343665623931323866313636663033663161383964646430663263
-38663833303063356637343130323362313734646564633261653934666665376661653033373934
-64393934616465383964353464336136636436323563366562623839623862366332343339613334
-63373063656663316138653939323165383735623263646438376533316638623734636261663035
-33636465396431356334383063633866623063316163343262623831616137643165366564646532
-65303033313137636562353238663564303034393166313864353330656335663233643763626239
-35346334386130653462343531336431623639376165653263373539316163383038336636613136
-30626137666133623063376333646134643536653138333464623930323931613461366465633437
-32386531323739343363373737326263323836333438356133613065306633326131343838333363
-62356331623163393230373838383866323063633739313339353839336232363430323165666531
-34316231376232396464356436326165616266323430313632393362313966376563613534633339
-61346532386537356262633936366533376239616531373133353633336235316534363436393238
-34373232383665373539346664316463613962383961386530323539313538306165383038333736
-31343463373938636630336364653931343931363461663261373333363336353438613266333232
-66316333613134363630366632623861363135373335613837653937666466623163613231376431
-61623964353534316464373737326134666538393662323663306563633430616363353833373131
-61323563653235646139623139303162616235323664613463336364326638363762653665666433
-30656634393965306436616261303330313037373030353266383833326539626263326462363833
-36656538663733313533653864646232333934333031363433613839323632333166313162646461
-32653935393738646163343263633563333132616436613930613038313462633735636131653265
-64663439323665313130653931623564373737616632386338336465363564373233616466393934
-62373763326533343830366438386430306166323834646362313838313662386637613961643138
-38383362633730353730333335316439663631396430623135313565313431646465336631613666
-64316638646531356563666631626663383939396461313631366462326161643730346436633734
-63626633303336626137333565306664616363386162316264636331386134633461636162333835
-66326139393733373262343537323136633233616331373730653966353736613538633430643264
-33623731366330323161643230393635646366623139326534353561616632636338333232386431
-35353539333831613064626165386536636664373933633833363736613335323434383663336561
-34616130656232326631613835646131353936326631396334663335386236653066326564656238
-33623065303039666461383864323031313737316565366133326136333138393731653731663036
-32663135323464653030626430303439353030393865316266383164616233613039613032353130
-37326430373439363631323061333431386430613361656439303734393730326264643731326638
-37343836393439316330653432303633303439623337613336626662323338633535346563343938
-31333963303866313763666436653265306164633731376432663634623131613166623535656362
-64643232383863633261613061373131313933626666643631666238663931336566343561333439
-66653939353665363065656631323130326664343464303338333161623639383962356538623237
-33656337323733353738353034636138656138373762343336316336346264393434306338336136
-66643966336130346263643232373334626433326334633363616337343466313438343133366637
-35336561353531306164316639643262316235383631626636633133343837663032343032613362
-33356330343833333438663465363364653633306134646537656361383864356461393963313666
-33316236326665346233653331663132313531663263623762393039663365303333663231373262
-63643634363762393863303739626162636131366564623333373534316461383861646332373532
-61343736396465646538363765653864626636376361333935366536343133666432323530376333
-36333664326538336438323138393561616536343932363733316164316133656631333233626562
-33376234663863623365373365303936376164373530653839393631303732356662663536633135
-36326439646465613363633233633836643162333164663266393161626231393138616538643738
-35303532636532656266623434333162323230646636366334663238613733326237636232623763
-37643066613361313436346531373835343131613061326366643638396633626261303630623338
-32313632653336316531333065343830656365306430623565393935333065663537316130633936
-66376231626239383165626536626564306331623935336331666662376264643765396464323135
-38353438613435333864326633326530623036396665313762613865383365366137303166306436
-35646238306262613432333434346639393939333264656530303637393566633934633062666661
-62646537306132663164643663313138646639363131346133616366313137333965396137316433
-31613439613433383663663666313237613336326134343437373637363038643332376532383339
-34663735386235313532633431313630366537326135366132373063333035613939363832336433
-65663230626536666565303031663062356639376538396531346263346139386436633434623363
-65323462393138313932623239373132326463323830616237323665656437336562333666396366
-30313632363138666534383631313366653532336238303036623235303866643632663335653066
-32616363326134343038336431393436326565343732646438333336386366383066346231353833
-61363565303737346561643938666133363565383632346465656335363864386236393432633832
-34663863393063656562623134316235366536663638653563323465666566613464373666376530
-37366364633537666231653065366664646632393638663535643931633264616431626366626563
-66656561376664303838653437306433666131323761323639663665376262386564336363376638
-32343661326138653734316161356130313636616434623434613765386538366131353036643532
-30353237323831373562376332346466366437643165633738623066636563393036623765376639
-38303135306563356533663238386233646636306266353034343433383830383330653032663130
-32313932303338646637363762653232613138373665396436336264353534623633616138383235
-30373433626332653032343937653964373161343462393139336235396439303739346330656166
-31643936333139656232353932326531633566363366306466666137623832313435333161366331
-63333432383034396439323466663235656536663831643035626332373234643837666630626332
-64363531306531393737666230363631336666366536363464353266303633663563316234653634
-62313135346639376366306463383837636531353564306530623134373236613635303132383263
-32326663376138393633383132643964656365633966656231376439316165353630623764326137
-61303234646566343863653130343738373331373433353732663837326334633530666636326434
-31336135613431326131353864613331643137396661333566303632336661626134666565623133
-63383865646464613537383533636462333133386639363837653436366237666164613639396666
-30643034306330393062313132663661636163383336373134663130666132373534383734643731
-30303163353563306465383134626137376630373731323939653531356436323337616662653565
-61313131663262636437666531623466623438326136653332666238336566623963343334623266
-39663134636666326261633634383264393662383733353663343734306534363934356165663638
-62623437633031663364306231663162616630393531346130333764656431616161626466343462
-64333865396463666161363134393932613636333330316136363737336130343663653063623036
-36393038336462373933313934353939336132313135623534393361656639333864613637626137
-66656331376235636661363534393163336439656264396663373665383737633263373934643231
-61316436343539646662316639343662336438383335383838373261643838396439316632653838
-64643135343938366236626463613036386230316263376165336232303434656230366561646164
-62656466396439666363613634366633623935376630313034633230643162333334313436643930
-34333837353937636339363364353333326238343536623131333561376230646237366437333836
-37613363663663656266326439316334383837613633336339396335396539636562636334316338
-61313536316364386262666663396261356538306536333761633763303762363232313332373438
-65316263353165653336343562343164306566353630326333653664356165376361326366333964
-64623261393636626439343738653731663130643839306639663239623834366364613832326233
-31396432343136306365393132613531303632656363303833313139363939356132393230633966
-39383432613135646435396262646461623735313135356230383533613136656639643539366233
-34306231313032303537626532316263663337303362663635323731333561343933663265373639
-39313461353561316539643436343764636665316233303438643736303464363839313135633333
-38653936663234663830313632623566336333633561656631336132323231353432323031663863
-66613363343431656437633631336638383932653336303762613730623534633936306333646135
-61613261613932653361623263656237643534326132613339653861343666393466613439303734
-31303430343132636332343134303936366262333566316638636233656330333734636636376164
-36383536313534306535336438633435353463353630326461336366666535313638363862616136
-36616236353033343566626332646133656235623162633736303762306430336238663835653263
-61326466663161646531383137333439656531383566303164366637656661306638623439323164
-61663163353263373864323734373434303530643764633762303139333336323832643063653734
-32373266373239366633636637613433336532663135626238333936353431343532316536653061
-37393131633066666637623538633530653730323362373432656439333332366638336361666239
-63646631633762333938636338323537343734396133313332393436326630383639333034643961
-65643139303531376163613833666532333734633438623935353635613635336262373432636462
-34323738386631616266313462346265356164316238323239646462643762333166666132633965
-37333535376235613538363938353135616366393964346164633861396331633139613463393035
-31313262356436646261636139383431643637383235623334353861343064666437356465373339
-31323364646635306163646131646339383931613461613330636561313235663934376632373132
-31633235346339373763303138356464646231373266366431633038646533616161613462333231
-65623835353963376532313535306331636639643635323434323362326462376239383630663962
-32393634366233616133323531633030336635623134393730626630636465653065633462666661
-63363637326139333030633333626531353866633839376661646437353939316166366137363865
-35383536666462343135623266363939623335613632613830316432343363313538623364666634
-37646531346433336365653935326437343461323861336133306233613931636231316232643034
-35396539373663633237623862623964383463613936623061376333323439653963633861663631
-64623866396263663038373561656239643664383233336433623036393930636264303662643434
-62366632323864633733626135343339623030636334356331393732363139326662326563663366
-36313262323933313631633562343230363032656636666465373062656664333964323537633362
-30343266393230393665626463316639336665383763343332333339383464333533653135353365
-34306135613839326361623663633033623238306234666564626565313137326431383763646433
-35316339366234353936326466363435323331353165653531373733643232356236383838303930
-61373538363238613635313031653434396265316434353335386332666135323366393062376162
-30353730613433383364636164306336396430633133333839383261366162363930303131303762
-32373461396264643232623337643266616562393865393864363161616337636436383131643932
-61316232313835363634353930636664323539643133333632626631666430363534383866656631
-30656634333836623133623731373861366333643637336566353064393332626461376334333733
-30383164306561383738333238353766666565656137643661623466313535623936353831303863
-64653762656364356664383365343264306336663563373763316532303537336138613238323438
-64376130656466393564613766633036623336393931313132393430313663373334353134363030
-39646665306137613034653830666437333832393464343265336162393231386437303539363861
-62333032393134666331363030336463363639366235656266363830653337333965303934626530
-31616532323334383665663936376130396334656137623537646663346166343262353764653439
-30396332346235653462633034653535396361383934646632386534643530313134343034323636
-32383538636537316532626230363361313330653534353962363932326331323966303833386330
-34623632356136616166636434633437356261313233333165303237346464396436343931376263
-39633963313062623636663533316538356162613734373830363838346133383564353336613437
-31643233343437393765376431613338383331363632613632396265656638646434663631303363
-35386332343033623534666530363831343262343736333366396238643030333337313838396534
-64633937636332313432326266643735383262643334613034643465366666336638393461616361
-31383038656235653239373164666265663865666537663335396137353939343233616435646362
-36393266633863393965363163376332383837626532343034363034346665343663326163653266
-61666236653837316639333832636536353534626365333939343734633863613032666437383864
-64326234303438363434626566306435376237336137316465626432383234383434343666333332
-33363333633132393265313662313731353162656337363730366439653532643438333639393664
-32623561636531376234613565323661613635623337303963653862393435663562333137383531
-37353532666639326334366133376162646262666439616135316432333934656631326566393965
-61643135653965343032316339353433323636353734313834666163633431366331393035393564
-32313966346634646263623130653934323736303364653930633439343339343432346538303831
-62333462343533386166623831383437373732373037356236376530353639346662663930336235
-65303564313939373532303137376565356364353332663961323366323264353738306331353963
-38343333653764323835303432643230663733643132333866303039656136326630303962643963
-39343737353166653862333030356533316165343766646231306532336530343964633136326563
-38646330386438373931323961653832613638303261653333396337623331323837623431656137
-33373631336462623531326438323739653662613139393866383263343134633335383738656363
-30333665663063373661623761356438633262356334373262613934333064326239376633633039
-66613534326662343435383438306133613765326361376537663331323938623436636164366135
-35323730363036643765376537336432333066303137333534353537633234626666336334333530
-39396133626434383132373435343165383563383564323864333639623764633064353131633165
-33333862613538363233633735653730326633346563383732353563643862356561616261393731
-66373662353937646462363262363865343531366463393761316665383230313331626630326236
-32353439323039316335343237623730393966356132656534633933333737653935613932643231
-63366163373062656630316661623131333462366564333462336333663833666363396639373936
-64613530383861643339353965666530663437356431353731623464336461383030306563393262
-39346566306565623331336234646439316461646366636566386236323464303138306663373265
-39346135663264366566623731656532323236316130383865346136353238353534303736363635
-34623532363033656437656235643066316364333164626662333536396631653531323437643564
-66386635653436616461633162316165343638326264303066633437313734383666623636666538
-66636634306532393339346633356431303537636364323832633737353139313138346632356238
-39393634666138383339323335306462623330333931326266366135616666613533633531653539
-39646535383666646662653936386231616230306536396432333536313834646538643936303366
-63666431663965343336343362356465306461313532616462383233316261336439663936313639
-35663261656534613634316235663139323937616261333530393235653836336138353630636335
-65616236366233626336356566326633646664356264313736306665316434613535393535353038
-38356331343436626230376334303138303962316231636631656233396231336437346435376532
-35316232306137333332663236393631636436633736353962663332626233363536633733353436
-62613565616332353461633930333636616164656635663064623463656238383430386135353030
-63626534393930663462323634343936346261653635636430616564643630313836316135646638
-36613363613238626364393434383966376430373838323461653131323563346364656330396562
-66373231643732316138383236636535366339623865393935383364373765636335656139396261
-35326339343266663863636361386431623238633139396264613166343564353236626237616161
-36626233356361666530323632393437623238663835616539373939636434353966643734653835
-30356437353566323266353233646532383335363366636333336335363634303038633965376165
-38306164663837366633306633393163356564643533663134653439663666316366383666623536
-39653666303363346131383064633835323261343361396462343566613237313732323366373864
-61313762353737616633633538616162353761353131636336623265313861616634376434363961
-36366662313737653465353363313537376361613534383563303764356136393563306230613466
-33356437613965633661336164633239346666636137666332303430633766643036346439326134
-30376636306436376564623338636231366536663530353537356461663864323234663530626633
-63656535633336346631386163643138326638663061373331623762376335646661316362363636
-36333732336138663034386139326566616236373061636661373038306135613031633139666635
-36626333646631636437323334653164316335396532396536356261346438383265643535306362
-62303034303161386465393062623963303131363165343066633765656431303035646664306661
-66333531383665646166393130386463323537386237383632333431333265616664323364306564
-64656463313133386330393266633932643863656436396265653161323665373861393031393338
-33373463303032326231313035646564663961363031613362356635623030376465383337373033
-30336263326364613633656532613439333631343665353866616263323137613163363333666664
-61383831616630373836343233373935633262383136663931643539653337643232363132376364
-65353662343539373437633133376638653633393864343866633865306231353264306262313261
-33366332316531616234333766323232343336613564313135656531306535643430636666346234
-38343532653666636235373366356635343339346237386436633234643738633033383664366264
-31396464366363323937333834626230383038653434346361316166343930366536373761353433
-62313638376132373661316436333430653735393737383235386164636535386130313533633830
-63616335643233373165393733613266646138353437356666316139633933346565633561353734
-30656261636265306633396633383638646233623164383236343335626432613866653834616434
-37663861373062653061316631373064336663353061306261303733313632373163326261663262
-32396263613639383534386236623836303635613631393763313130656134656236623238353661
-38643538343135386131393133336237373733613238663763653431636436376232646637386339
-37626131396237396239323031613265306262326466656634363266393064326631383633656338
-31313130343064326135616433343533653563666663393230363735633239363537376463663466
-61353865333361373538616236393235613366333635633664333631653361333962386462373761
-30313066356564363432363739346430346633386436613739363939336665636239323930636130
-61633639363635353333356266383661313638353162373535613165333063343332383231633331
-63313339306235303361393362333635313331623365666166383937313663376261653838376563
-37386237393762356339663434626639363666663931613832653539616630343137383230346163
-39326138383165326131616639623033633164626466663439386333393231373537616439326161
-33366634313739346266663564343330653062393139616464393634313234336165356338303439
-34366537613163653339373062646431643537316635343438343031613937343734356130636230
-35353334323130303439613233333439303234313530343861316261613036326266396134393938
-30393032393864656661346464666262343431386364626662353736343234363861663437326532
-65663835306366313362656135386430666633383165623965663838646433613835363836643365
-62373730343831633033613631396535333232333331636163366162613131356132643835663766
-63643531663237333935393330353733323730643732386362333734316632636265653731663039
-37623365336562623766643833653533343238396139336231326262326330316338343738663031
-37383334333634366464653836353238373061386334333437626537616135363736313364306366
-34396636383934306664363835633965353463333465333966306537353735323564643565623261
-31343932316537346561316662306139343266636463393130653434666666393338366531303734
-66323965346632306535623931326133663161663464643337373761343661633763393666636162
-66346566383937626161633339663732666436343437386233396332633261303533666436396430
-64303566396530616365613935623763323962616564373130383637623334636134623637326465
-64303037333035303930616133396336616432663338396634383037323238623961353136323965
-31326266383838653236616435313936396537323761636436626539323336663037316161393433
-64626233323935396232636337316634623037656231653661303462333961346230666230313834
-66626661643231386135363565336437633738613263636364663336313137376635396162366235
-35316638353430393837386265356465363834666366636432656237646634666533636631663530
-36656434353038626332336263353832376563363035373437316262383733326661353762393934
-31333532656666343136343635343435386337363962363037336331623239373035633631346337
-31316231623761366235303538336339626134653238343132343838346363353266346239353663
-64613566313263626537333830646439396536366135346362333162366539363537616332386262
-32663862313739316330636334346664353666363933623563643365383630373866656537633033
-39373331663663623831383830656237653034333932376263356566613162326566346537373632
-36356161643766343934643636633633363135653537396333613532656464663535653863323066
-63393662666463626635663062386430336233613637363263306564353563616439666436656162
-62363330376430336663393565613736306165336630383336363263643032653062346661343766
-65646537343063663864333933363938613438326163353235306239346236656561346264343039
-32616331373062323066306232383030373130303565666463326434383331343361393331343039
-65653536306538353830333434373433333030353465313866393966666434663238323232323364
-30343535383631313431636462356630323439323965353033383536363866323461373538666332
-63623935343665323033326432356432323730353864646431633035363831313735623063316465
-34623064303864393365373635353263343033653064313163633936366564616661346532343138
-66383130396232353166613531343338636664363164613165613737353762333466616530643937
-65666530363165346331356262363065653861386261623566346135383030656163303332323436
-63306137623430613661333733643161386138623934313863643561313061363061663435353335
-32353362663064613364653236613862383830356431333839636163623432346638303230666438
-38353766646231383436636463346436393561613339316430323463363731303762353330346532
-38646130663862323466326136313332306561613933646637366235646338343161666161383431
-37626230303633303664366161653437643331386435363631313935643764643835383662353536
-65626132313961343564373538396237363934343335633231656362316238633030623365663063
-30623232663930643639303437336563363131333531333238333663333136353964363439363836
-37376233646330323364363764393732326462316235393633626134356138653430346537393764
-32393739363637376534313836346239626639636332326666386334636234353535623035363266
-64633661383438363336656539373033313635626239313232373233613764323665663762343461
-32343938653135313863316233376632396666366636643036623566393739393537333235396239
-34303034396138656531343662613838316363646461643136643432653132306466623837303532
-65316139316432633039373239326539383165313430656364646336333863303464643961346363
-36623830363235316436306563313239636463613537623962393061616632356632356136646531
-66653561323232343231613863356466643030303066396665623638383662666465373833343733
-31356563623761636630626630356362646164373662383562613264663966326631353237366130
-34393439356263383732643665323431653738633236313539366535396664616261333232306535
-63306662346465303835616666333434393361306462653861323430366566353435333231353935
-34383264663930303662663462626535346130613033396435653934633933366464343166306165
-64623461323365623634346463386234386561306339613461613438663034333334643365343531
-32303637616336616463383566386139323639613731303263646162613262343531306665326261
-66393038653234376132646136613263383531656632373631326361313332613739386465343935
-37626331633063336232326333343037646432323265326131653665333863653337663961383737
-36663361663232373338623931393538393461646538646565323730393562353836623263343832
-38303333386363313634643930663832656262616537666531393536656664303539306563653265
-64666538333135656132643637346666353930356635393764333538396662316366353166376433
-33626232383666343030363263626266656538616562663735353534663164376434346631383762
-31376561376430333036393131356564663737633064616361353038633839656164633536613631
-66646665613132623062383465623738363330633039373135343333363039643332363331333365
-36306636373238396430336530633763613332336432363933303733346133653666373132393063
-30633437356363666235326263386566643062343534353238633062393565633838623839316634
-62323239376532383163376237366431313734366665646161626232616566323631383536656632
-36653535643537616230626633306630383934373135363538656339626432666563663638316363
-30316262336461303438643964366434366332336535343437666432663566323761306563623261
-30633965623530346165633936616366623536666230363130386633633061343730373365303833
-66646334646634366433626331626137386531323661386132316235613966663730336432333764
-66306532303566333834613537666639616663633466633633613832363164623536373738613265
-38323038343862323166663533613830666362353630323035336235393565663230623562356166
-64306331363234336433323364316232653934366662323465393961393862373738343063316434
-36343035396536363136323734623132373763366636633939616339323965306564303031663331
-63306463623732373462313035623532646334623532363666633461613066323933393433376463
-62626563666565663438393332646435333939653439306234363930303637373965643366656131
-31383834666565623861356531663164646165313638353237643831343337313362306232393737
-36653062323561346661326133326635643363336465616636316666613335623235346161376136
-36666264633232653638626138643934616366663938336562353333393265373137383833356234
-32303638646436393865656336653664313136653831336636386664333965383461663166356363
-30383139323134303035626438626632613562663164393934663636636338336134626530356134
-33643930643532376532303466396264386166646166316166366661383263666563333764643365
-38633438306538316338623631616337303933373432646664313736613035626365356433323737
-31323364616464633830643133383661366161613137356431663330633032386136326334343264
-61633333356230326236353330316264383738303033323930666562393932343235313932666133
-32623636643563623166383231396433303735303534356334623330323933666636366365626266
-38653038306135326431343832336331623564633364663033653766623832383630643964643032
-35633431663062353339333266633835366430646563356434373537393937313932346432623633
-64373632343264353066633436626531636232653038613263653038323830616164303361393732
-34643233633731373637336137383763303736353237316134393835663032393861353934633038
-30626531356333346336373535313433623035333466343066346265326336643162323133656339
-37323561326137653939303839343837393763653465363462356161363963353865386539623333
-35383637356666633731396638643966303063313430393038393234346433646566326632363637
-65306466613230353261616366323634313837373030623563613562333833653263346230376439
-35643836346335373261326365336531353733636236373466353332383737613639633034323161
-66393432653336636362313962616237316232663038343665343065313030313937343834356436
-34326266343364616366343039303332353161373263313730373839643361326333616464306133
-64643863633336363762306131303431636366613038623562653035626537353466643231356561
-37393035656533666638336637373932346662346436313561313964316139613763616335316435
-33656230356365373365633830653835376639373365623663346635396361333338376139666232
-33626662616662626363636564306530613034663039653636663838326162616263343562393661
-64353134363737623139633734306430353265323835373833373261363031383163343938373862
-30363735633531376230376161643037663762316466396134626462346133626264353064333039
-66333531613735313333376336313565376632346565373134386433663935626363336635356337
-61633264363635303833613462346263636433383634326330393236663835626432326336396133
-36396462323365633338663935343733346365356233653436613962356366383365326262663236
-34316233626130336635333933646463663461653364313338343534633630663733336261363431
-37343664333633383536633464326466653432353733343933616264316364666661396631336135
-64306637623234643735643430323262626539383439373363356139643362663939336665376139
-35613864303837363635353564393532336162393566313339633866316266363261623266633032
-61343365393762386465356164646531313865633633313866313162393431393132613131643462
-38646131363036313964333930663234396139613362326331333538376364323461353839366562
-62313066663830313862326162326166356537653135313036326239353032636634656433316530
-63336532663935616633373261653666333662643561313235353466303632623364336165623334
-63346334303762326363643838336362616466333631376135643466306638313038353765353034
-61613033623132653930623634376537643230323330343534646365356339333938396565336533
-33303730666433646465623231306233353130626237353236373836333438666565626566326531
-30373637353237393934343064616663663762343135313865386331326266386639353430306130
-39353534663362323665616166373733623639333164656633363537613437616635363639316232
-37373365336531323639663935313836313338653030396133356365336437373963313231636332
-65663433646665383836643362383739653663636338346137636263386366386234306130303264
-30393266376138646465613436613736373662643365663330313230346139613465383136333463
-38626661643165356364626164663164366534316462376633653231626233393934303333313963
-39643362633761353731643239663334646266613536383661626462633062653231616236326332
-32393634643030656535633139336132343639313939313436393865336361633430376166313230
-63383435663766646537363136373138316166333031663736616461316134343461356438366361
-37326663343434323563613231633530316364643164646464386361656632633539353135303432
-34386162376235326631653764613866323432366166663966356534346463306231656665346333
-35356633356262303236386633316539363536653438633334623161343136623161313463626633
-61373637303630633233383430346534613336363739653332376461383531653832333264356163
-32346562636662323066643932326436326333323537323932343033653862356163353730353438
-31313531306462636131626136613135646231343633323065623363643661303336313463373130
-30636630623734636536366631653031326162383034623233623463326434366635383836613361
-61356463336335646662353735333662633231396331336336636235663839353163616234363733
-32373438393730656461383537353038653739326335313732636639656263643033346635316465
-63306437613863643932396361346335303331366535393863613663313133393730333039306233
-63376563366636313435623664323632383139653932643461383536313734343430613736393734
-38313061623163313931616564623366353266333237643639366166313564336437376664303938
-30306233633437376233353237393331313734633063666165323637363938353239653539613439
-36346232626466396431386664396535663162336166313438363265353232363365633034383331
-36393164386235613134663566666539323539313735383636303631336337386366643561346331
-65353962366336653139356433366465616637386333636439333365396563363663656231346333
-63366636336131656237396234353837303035323637343265303566333761353431613135356635
-31313664316635636564346531323638633266356634323164393563383935343738346632333237
-35656464356338356538366664636265306165653334316363336435666262636634326636383934
-36313136373038326363366263616438306561653565656435643063613537643732643332363037
-63633962333637326434363936346633313634363961613063303664323761313533646638666139
-64616436366638353166656133323131633461363663616336353730336639653463383033323061
-30646237653463313261643237343933663032346133336339393965626166623066373735623836
-30653331656635373838633062333638333037316439323663323838616530663530623434653964
-37616362373331633030396261333038373162336536373731396363646334333665396630376263
-37656634373138636633386163393234613434376265393065306333353661326266636633323634
-62633031363965346337363031663263313538393064363761366336356462383737313633353236
-35613261653563663663663832373664383262306232373430323934376330376166363738343962
-61323863336664383266313264613563636464363566356637396261353039626166623331626234
-39353762353536646338613066656533303332666664353863343838356464616437623934343263
-31313838326531356432353563326334643665663735366233666534343733323865636562326530
-63333166303936643736623066653832346339343133346632343164373630616538633936633631
-36376663343934666133343535646662623038666633616130323163346533393765653337353832
-36616563393930343065666361376635326464333435303736386661396263346331636131386336
-64326665643536363563343964623536306238376535656330323061663431653532633434386634
-33346133656630636565613065323634616333396363346534303163393337613830366662303731
-61633530393463633635346136656366333030623038616439363631383466303962333238373661
-35386332613264303739343931336366653431393134303833323464383439656661303163636464
-61363462363064393364633061336262353261336662363462636462336462636535366662333534
-63363666626137636633356631653862626639346634373238353636666236623964373231383264
-31666563353034386365636264346464326237663235353136346339393436383035663034313630
-37333963373135643430653761643662353334646439313262393635656662353439616334356338
-65313166643934623065353164633965303166653830306165333837346262393563616335343764
-39313033373339626534613838343239323661613530323666356665353431356439646231613638
-63323862353230373562393039656361376434366237653365373937336332313762333561386432
-61343435356633396465353133333066333563313330396234626165393364653031353939633731
-37623439336262373838393533626162333937623133396365373034613962623161393231303562
-65626133623833383465396632366137396135363434306337353038333633653264616437633635
-66396435663931653534643239613636333862613263613434396261323238333461623661613437
-64633331393461333831633162623333623663376165343530326262613362653730663463313039
-33316638623664663837383837306163663461373636643032303933366338303633613830356665
-34363165663232386237643464646163663136396232626138333165653162303339616362396230
-37383766313039643438346136623864326334653938393039633961373339376665633536336437
-39383033393635613034333634373834386266626534363833313534393134303138363162316533
-33653333373962643965336465326635653732306338656631356564363961366462636230373030
-63393837356631366638663964326530666536643932343861616665633331373230336530356138
-39303738386166336334633433353339613366643436313064653333626130313361656237623163
-35663263633136373765343330343338306636663534383730353235636434656138643466383261
-62373661616137613164363665353535633637613263646361313337336533363665626462383633
-61383731303132393138663639396433343530336266633939653366633438626139666161653638
-62623866393533346136343339363334666333613666613031613135626235633564353463366664
-30393130356664343434633132313537383063663130646464346263636133303034316266303739
-30656661303231303434333562656237633233616539333239303266373363613034626263613531
-35393937333761633232386333353134613362396138353030613934353935356637623630356533
-30626431366234383834383866353436326333386564353537663136623761623736313861366336
-31336331373537313739353933303261336238613630636462353031653133333139306363326566
-32373264306338353638393965343933656162373438373366333338623434313032373538623835
-63316434306262643532616232646430316635306535316635326564316664353063343331653963
-61306530396630323031386534653062636533613931613632306637343364623464386137623330
-39396166306333346665323139356135643662363564633631383362303636616336613732383763
-35353861343565383739336535623962666239663963626162373861343738663364386439353133
-62666232333533376563383536363239366135306134616439643738306331643539383034663363
-37366366643838666338396537373232623232326263616165616639353939323463663638643132
-61353038646233646231393961663863373466306461373832363435613635383836363633393039
-64346134633837333332366135363736323234336235626630653965353039663964383535373931
-63303262346661373535376161393136656436303235386333663033656164363636346632616433
-31353932643266343361626431383835623761653633656131373134633163343137363536336661
-34316633386263306432333338313462393031383832333533656436336230666363316133396162
-65663861616538306333373032626539663535373161383462366164373764343437323562626136
-38653336663263306533376466323132623261386166666435353438663763316665653039623532
-38323730626666353636663830373765383138303330386663663737623531346630363936393966
-37663839623464393136303934306438376362313233643838373939323938666635626630633035
-31333466393833393361393965353636616661353166323937313032663139386431333163663035
-62373265306132643465363765376663623430656264613839336234343766613833323235353333
-66656639366130656534316639306638366465336661643263666337323030666263623036306362
-64316634353139666434396261653161646339663263663131386339346631653932653834626562
-62386665616131386138633839353262353230316264383130656330313333326538636261393863
-37633665613631343130313163376337363963653134626131643531353565666537613636373663
-63333633313561363438653035303563303532613736373634613362313663386563656339656634
-64616666346532376537336130353233623832336237376663663837643134636361616533666530
-63373065663833363734356130613230613739633134643766373935396531373965383862656330
-32306639356365383332643462336331383731643864636264633234616132386538396533613432
-32646638656233333661626335306361646435306234653436323361643866633235313962313637
-61333637663463643066333562373535363439636666643538626133623432643932666662653233
-33306137613735626135373430393033373132356666633337303134323231323235326434323639
-63326362306136333065393734396339336665313035663637303533393834373664623864386234
-31313062316334333130336138326132636366356266653531333435386231653063646531353933
-37326533663431376461383632643266663531626235393131663464373439396666343236313262
-35316165313962383632623262366164386130323065646436343236623230636664306539613031
-37363564343438376637386366376139613332623765663166373731316262303630326234383063
-35303330333364303366363135376262323365633561336264626333323564396132346362626164
-30623637333263366164373465353562356561376238353332353461623939633035643562356266
-64666131376335663832373136646266633363386139363864363939386534636461313237666661
-31383063366362306466633039363730376130373661366331643836356533303062323030396330
-35623431663561653264383531626136653363336339366332363431323635393561363763613134
-37643733633138396432623031666333616136643735646235346632306461313136653837326135
-36643935303264303532396332356561643063373263303536626433623264393432343933363237
-65616237656131356537366337316437363831303064326436393761623734303238336334653131
-38363437373264373636653531346665666363616233643563336133316439643663336263613964
-66613835336638386631386565343233313435356434393637326339623933306134343332316132
-64326434393134643866323935663331336539396636303666623364363133613861303366313736
-61623465646336643161313839326333316632653365626231616264616633623336633463663232
-65313465313965316139316531623863373235633362633731636633393534663662623663623533
-65653762623938343833653639373730363932366330373237653830316438356666333636663938
-66353139333162376439306530653839306436393832333030336632643830376663653132633633
-36373965646666613436383931643662383263633066356666666362306430373636336438626231
-37653338336462616333353937626363663765346664623862616162353865633463393263626537
-32333336383633383237613731346465613635633633383065643038333536616331333966373232
-66663231343266393865663165383937633439373064383636323137363566646133616332656566
-35343335376465653939653933393161396265396136363936656433316566613336613537623365
-37393364326337633362303662656333613934663362323331343135666136376365663765346439
-35303465303163333732343737383135303635613865346331376537336566623561643837333433
-36633930376330623737633836376239663333616134356530623264303337666432326332646433
-31633034303166616134353736613838383231666363623563316430326461393462333564626335
-62646337643066313563343466303231643334666437383135393432663538623464313735663431
-63336166323839656531633862326534353136303264616266373431363036643335616562363438
-63643464356662333065666663643464623139353833353536323466663462313630366235303065
-34623433613736646465616466633232656362356137366634393735623031343531633231306334
-33393137343637343734613133366239306135383931353637313561376161666562396237386436
-61386637376563346633303032626361353462323963366233613566643434666532383965626661
-66663165336164313431653363653939653262326537623630643237636163613066323434653633
-38613939316463663833643062303933383165393939333233643139666462363037613032306135
-32643266333938653962366231363364616339656137646432666466653363636265643364656363
-32313966356238356266356339636465376133653861306233343635303135303735623037383339
-37626335333030643932306164316535353933346462666337353366633966346363366337623133
-65343766653261353365643039333164663231323031393233623062366432373430396563663264
-37313962363831316137663064313631646433353033336537636132623663393637336438366463
-36393565633936346134643465306639633737363431656161376533633434636663656535613037
-61643330383366663266626436326466646234333831386632633566663831336437646563333635
-65616339626561353065626462633530633461643764373866376264636337636431366638623839
-31366338653632333037353233623962303866303334353033343739636637616239626237343764
-39356464396239383235396132316665366238373833303266343535636164623862656139613064
-33393264363634636231653235613133656138663763326263386334303537333733653132346533
-61383739663963643365393638616233323138616131376461323233643262656633636435303566
-32656438303466306361653366656464303335663661656437373031356365336334373961386264
-32396230326431376137356534336566643137356361316232333939343362323766393232373639
-35363465356235323331333265303535623630666236376230633364643237653762386630323836
-38363136373331623964623964373163363930313138393030353636643930633335323761383764
-37316135393466323139643738366537396133636465393565613765633938306164633263653032
-35353931643438633436306464316230333437373532356261613565643164656330643862386635
-36616237653834653134646439636266643131613761373833346338623439383861636330383133
-34616630313465303535613032626536303762623331653435333633303262326464306330393832
-30623265346438656137383937306366646530613564306230353939626366653536653738323139
-63363332626532346462313635353366333235323837353961323862343334353232313464626236
-30633336316465666637626239373730383965653737663639336261306264343530643364663561
-64666265613762313032633837333433643537666562653534643364346637356363653732306561
-39623538623763653136353464663164356232623333363033646666396232666261323233653661
-65393536653237383863653134356134653533316631623231616539653861363538376362663066
-61646261656336363931303935353764313562653736633431633263656261623039613737373432
-31373165386161373038643831333937333366636230326133616430346131386663653964313866
-37626234396631646639626436326466666561303734346134653764353234376136656662366539
-39376161616162653337353235643236323832653835356235363634346365346462346162306333
-61326534393264666163383466616166626463626666616438653765346638383763636338376463
-35616466306230383233366266653064343962393731393434363435333466616462376633336338
-61643061613963666636336366663562346366616135326462383864326562346534353032343662
-37363861653866363630373565346266623037663233326432316562356661333538666332313465
-33333930343965313030363262653862626461393162653135666666336262663634653333313434
-37373030356665616238363438613739366337383961666662363364343535393033666336636465
-39333431353939366439393761343039626663386164653330663135313839356535393362376135
-66353531353461333539633135363832393235333535333066373461346363343863323239626335
-65313638623638313437303865653736626133653239643232306437663237313432346633616565
-37303539333830663235393862396665313164623263353932313036333362643361383732346631
-33336330656565616331
+31313364396663636163346533353463616663623038636364623761663537336162393732616665
+3434333865326134343164643636626433613131356139610a303039373364643263376337303135
+36626232643937326635393562653937383530653262313634633132643666666465393735303935
+6431386665313938320a376163373263333833396234613837646431633536363863303837316139
+63393639323933633665306664333339613462653135303934623233326661633666306164326635
+64383533326335386232343864383439326463653733663836303038353036653032303661396635
+32656664663336343264666432383164386530663636326138633166343365616135336561656237
+66333736313166326532633331303237646231383863373536636439333235643531633961376233
+63333833333861363130386537363836623361386134633633383534353330303163326439393466
+30393663623061343561373834363038333066393163316136373636373061353932396464636330
+34373364326333353530366231303833373061363930373336316635623566613033326632303833
+66666231653734646336363330633537383633633333376466663539353561383735353830383738
+34663332366239633738643437306539633835396131396461386364376233656561346264653330
+30373339663364323236376637383938663266346530363965613462306530623166386435663833
+37343833323538353933333532643937613363373031646238343365336161393432333065643235
+64366638643562653862366263353238633430613330393137383764663263356439666565326265
+33373534356233393630636337353734323039363835303834326438303432323731346665383139
+31653538666362636232343136323661363138613933326561633033653462633132643435646338
+33626661653031633634303938646436656565346163636665636532383632313766323139303936
+63356130363366626630386161643566363536656530316131303663663735643434376135333236
+64623164663365326563323961323134643761616435376338663539393666336662316661663565
+30313731623635353135653434303832343034333538656537663663353263396231643533366634
+62656663376564646630366332386434613934663938646139353133666436666538343162306337
+61346462313762306563373736373838303562353330663734646136663435373938336533613262
+34373432366364333833303437643063663963363031313830343333393738393336343863633432
+36643030376164616564323161666136323064316665313662346439303533396639643539623432
+39303139373463313730613461333361366266363533373238356336333961313239303336303639
+33303637333363646331353265326265373838356361383730633938633535613832356163333534
+62343936306366313265356339353361303364383863373935663437653565323335323765306634
+35613361333235346162306461643033613866613561626363613131643434613838313237376339
+62316335633735663961363830633130306365346431626534356564366532356531323933383663
+66393136616230376439643335636166373439663264383738396632366537353466363861643463
+36663735666138643362633836663933616665386638626538373533663839666533356437316266
+66323162356135636361626131623865653434633666643934613335373463393962353737386438
+64636266306464383730336334373433643631333466393965343861343638306431646362313531
+34623933313839313930326135383230633932353933623633343436333733646136646330393235
+38623034653262393231633534343231626630643730363864633464653465656235363731343138
+35376563373730663639313832383831646665326332376134666135366438383765376234653336
+64343431393961623331333164626333303338653461366534306664646665313630356164306566
+37613633373235623335643137313139623131616262353230343135386434333363313830636632
+31363762663333373734643765363366613638356132313763333538333136363537393531383937
+63653731353133646235353337663562326162326464613961383862363461353863393665373531
+64303161323266643636393337313363616536326536336135396533633062656361323265616438
+39386563376530343330633135653037336133306635633564356137333864646262623636396337
+35303731363337626635306234613333383065313962326439643834373863383133646337313532
+35623237333663613833306236613564393061303864626331366363653132336635623031393838
+38653439326464313863303538376536636235666630646232656365363838643538643166643035
+30656437343434666335393839626565303434383462313033343430643531303933646561326439
+64653734383236613139643061316333323363653930363236633038373931636334326436393931
+37353536653462386361626330643236333330626363643466333838323836666237633462653265
+36656262326166306463316332643538646365333865373165633330313461333666316530626138
+66646136346530313662346331373962343663656363633437613564653031383337393839313833
+30666532373865643639356364643636323964303436343735646666363237306630323439636164
+33306136303732306537353436636239623437333664323039393030666537663136653032323036
+38613763653834303062323365373130626663613862333764353234646136353033663664623265
+30643737386465386631666539646366313065326237343430663734313066373731633237353266
+65346666323734613039373163316566313839323135396662373839393764653832613866326464
+31316332613137313765326631346433313331343561393732333238386533303666633133376538
+65386262623433343034333737333364336261373361353934376236333334336631373930663334
+61363230326662356131613737626261646539326431326437643235333863656261316436643533
+30663364306163386431366263653362353531653564613763393164323061653261633165303433
+39383931363130376334343462373566333133386433396261616662336263653364653432373265
+34343936613061393062363933636264656464313738393566656162303534336537373265356130
+33626237353835383666646130613138313431393630623036383635393930613135623430633737
+35383138646363336437333534633464333733643132626130393532643662313762343532316330
+36353664383966373034656365366162623430386162356162383235396137386239383265616539
+34333835636631303938323132636130353035653834313738353931663630613332616364336438
+63643961666562383864396437383530386235623537333762346234333962396464353335643563
+61663164623035636639343939636565646565386364333737653734383133623738313563373935
+63613530656137356439343763656136343462616139346336373632323036323664306637343366
+33383137613235363465646430656230643131666637376331646262633434656235313535363234
+34613130336432353535373036333931643765336534313135366238316431326462643166623337
+32396135396566323963303937346530303535383136316666363466663266663331326631396461
+33313064326532303638366263343936666433353235633436356562336333373332356235643031
+32353136333434626234646638616436383930653961643962393165643066633137656131316139
+35353432343164303964316638306664386336356263666535663937323666343434306338653364
+30636663643339373833366166336331316235363236313837343864643864656665303765303462
+30383332363535636338636231376136373364346263363430653733353664326262336166653363
+30353335666337613762393431623262336433326563313361343133383930386365643365653361
+33643961623636633833643064626263363634656330633136383165393539313139353838663263
+36663530383434623263316136616464393033383137323163303135333539306338393163353832
+61316162643132363534386563376432623564333732643739393733623061303436353731376365
+32393362323037383035353265356530353661333863386533623834346332663935396238613639
+36636537373432646162626234353036383863343264333036346362316536653331646133363330
+63363432313463653362666263626366643938323766393764323831636336333965623330623232
+64646333383461376465373563313361316431666566316235306434663234633261303562613765
+34663064373432336362626331353438663235306335396237663639336361316634306362376463
+38346363313439376361386530343833666532323562306663666434323565326430633834663530
+64376432386164376538653535643961653431326439643264353236323839323637333662346431
+61323731353139346664396635633436616332636536656530333939373663386334306364666465
+39633364343036356431336637663035326261613331346430366331396361376236306530343739
+33666337313538323733303438663133323663393035646638666135343964633730333031346334
+64643161393236333533663737363538303961386265373365343434396133633638326665393065
+38383062353533373861626239383935333064326638373832333332656138646133323839326435
+63373463636364363130616638663136356465356661326637343336333331333266653762393431
+37666166343330383535633032333962393362643831613666383662306561336338646465653633
+39303239633435326663623932396437623061653530343530663239366232663166343265363662
+62326333363037363266613164396133306537326633303938666432636235336136343965633138
+38346332646639653063623339346234373664656362643731393732613239663135623134656661
+31306136323030323737316634643835323033646637323266326333613063653865356163656138
+33383561323432626665356562623731656230313565643664323963373533376661326238663865
+63643434646133643663303864353132333530616234656537656233363635346234353064306533
+37653861316463303834353134656636356564366565313939663735643666336263376634633662
+36636335646532326330336261356362333461346339303433393030383565313164656634626133
+35353632616664633432666532633934623931323535643763346164383537636132376365323262
+66336539303334613261353733653461376433636633343063346363326565313132346566333638
+36653862633339303636646430386562666639383638336137346463656563613863653863363033
+32643239373832376335383235656333333931383261666135373564633037373764333231663432
+62636165393837393936336466393234343639383138353231383731373838353737346136613164
+36316261306430386234656266643531613832353036633032333431316434633538353139393765
+62636231646361313464373463306434636566663163383531623735346136636134333339646261
+61333564383536373165383463363461343166366139616331653234626166643636643633656662
+30383965613637376532643439373365383039396530306634653061363865373737323239386431
+61636135643564363936313135373466373361666463623333363739633739323061663237303365
+64313633396334303735333132343563323036303936663130643232386265363166303562373665
+32333464316439663737313438653537623065616336373865333362383662363033656563313632
+65373937613038376634353061313762323266356530656463303339356335363666326164666439
+64373037666532303334323262323834346266396431363264323536616531383561373338336466
+63616135663233356234386333333761626135666130303933313234396535326530626230326138
+64373139363339346334383330663565636336373964613733316235613761326132346464393831
+31653236633036653839373338653332323163613463633362656139343233663633393836613131
+62616531353333373764636232633230346265633461636135323832643661303730623437656633
+36333665323765386265336664373966643336393033363234306139343339353066373164306539
+36326638313464366561353261313466666334656231363466633666613862303635393566356364
+61613463626130393361636363333630313836623238326534373733663734383632383738613163
+39646237663132363064636536363834373565316433383362376338303963386532386365373638
+31633766343166303031316465343638373866396436393838613166613166373166616463336439
+33383062346562386465303534616463396635353235623236393835626236626236376366626366
+35363732633538303966623137666461333434343938383562396235353162383036643637356136
+37363134323639633961356466343162353433303438633531616465323938636130396137653130
+31346232636537316363316161363531633537313034333637393364303961623534303131666130
+37656638323265383135646465346331633036393134666136336633343064646364643930306163
+35626635623265303263346230333938646131366336366536353534623963663030303838303036
+35306165613335326134353030633036323936356237376631623566323738656139336466663831
+62633731323362323333356463326262613739373863626532616564666262636164613031396531
+33643834313637303034643232386139303563366261323762363331376363613434616239656566
+35343635666233336563646137303265383938623864333062343662383766653164633037373031
+34326234333830343630346666316337383837623865653931383436303436346139343831396139
+33303937313432656130353439623166313437373164336339353339393639303234313033303233
+63343537363164363164636561356635636332306562373063383136666265396334633964353262
+32313137366161303032306434343438363034306630646437353036303731656238383335303737
+34366435366462643333323436333037393637613962363766353361313066363630323932346162
+36396566326265363365376332383161653232343337623131633538393664393234646563356537
+65303163313062643233663631396165613038353733363362626631396232326437366664393639
+64303635393862376532383438636362353661306165646465613837323939386434353466383061
+35303065666336393936653531323939633464333033323863613031326563343335656164373264
+61613932626262616363616337353163636335623633626265303564623436333965616362663438
+36303030363239613237393433646139373038636335646538643536386561633564633734636538
+63383835313432663433393133623365336461323861623361303062376363333630396266396363
+35636238313035333333663833373533336530393135393534616564653165623339313963303666
+64666134373239663032326266636431363931323633336133383264653362353666373930393265
+32613265663939623034373362303965616236653831383466393266653963633637303433623364
+66353933323235326636383434323664663662653665623762303030373536646366323232333265
+35383765616136316139376230663330363639393038396465653966313931633430623662653830
+63626364306436613037613537386433366537363463336532623333636465623638616332383962
+37376631343961366539306361386337616364356534643963623766643265613364646462333336
+39613432373765303362653663623561363938326665346333383865303862623734353965376238
+34396335316266326639343536386430396361623938626565623236353664363736623635306139
+32333261383732656531306137363934393566643566333534363532343438633961373734343762
+31326139356364326264646336366332663831353632626636663661353561626566623936343431
+65636432373238343336356536316162643339323439366530636130373535633136303535623732
+31343035623336366237666565326636613138646561613233663738346332313730323334346336
+66353963613632636538626433393937373033643338303733633962643964383434346363666533
+63646466363431336137663438323532646437316161623934333563356165656234346663383032
+32633063653539333730646236616539623332396531653631383133636231363661653439363638
+33353632313565363731336266336362613035386138653437643131373066356439643732643964
+62313335306236373739633531313233373964333462623663383131323633623337666266323665
+33643666383839303366333561313566306139336564653361313265393331643731623265616165
+34376234396632626137373335383463366335396661326362363134376131333333373866633639
+64666130663163643536343965373166356261333330313030663664356435393035396562623531
+33613733323864336433373834353436633537326132313732616436623432656664373566613436
+39646566323335333536323636643765306366343633363236336535323632303433323664333634
+39643830366238303830323666386431323830616336396163663632333232396530353233636533
+32633764643064396463376363623638306133376664663966336636356263356235313936363436
+31363338633634393633386538336535633939323661643161393638346438393164393832653239
+31613031616564323361333934343437366364343661623966393637636438653536313032653030
+38323232393337323332636661663233653530373234643237333061343861336165646364343663
+38633263396562666433336162363336313464303666303934653034656231333030626536303763
+32633636663061666361313730353738353163323839323265316430333563646639343737633066
+37633337616563663637623133393338323033316139346265336634383164653361613835616561
+37383161316461383436653231343434666134636462393462313932653937323031313635376165
+65373939613235383866306138333033306134386636326562383230373539316661623436303335
+30323562633237326237393463613662623163316532646163646630353131626362306333396139
+39326334326233623165383135326132666266383664306433636630376165326566323239613835
+35346263353534616463383133386365633766303434383163343163613337613565643863323565
+63343031363962316136633166653761396666613633356365333133386137366264653039396231
+34393731633564393135306664643034306136343862363636643165373863393363643336636663
+62363164653730373738313965313737376364343064393565356439366539333335313837393936
+66373336333662386166663534663462396365616566636635626562336239613434326132386335
+61376366303633666532633835346161356134316266313735613739313562316536333135376632
+64313235313663393964386565633831616331313739656331313464393239376439363730643863
+61343938646634353135326334373663383738373733343439303964353765616663316238623430
+36366336376436366364626636363265363630303232363335666431306432373962376564363461
+37323233353131633136376632613439363466316661333666643762353036623164636437366232
+62363631643266646633643538316164346134366265333461346365636238626461306339306133
+61333130316561303032393134386530323038616238376663356235366431633164353830623530
+30393638613064363963383966373838313539663931633831396331383036656565373437303431
+34306165663566346261356635653663356132646165396464326231653630613234366139376132
+34353765613032333339643265313134643461646664663436633135383332306262343862396165
+61613665363930656438633835313264303361393535386533356230323131313963373363656531
+62373538663435616338343838333166313161373837323535383239633063303835393736323666
+32316364383830326437393133663064316438333062633438656561373330376232333232323232
+63396634393132306665663361313937306433653562646561653537653934353366323133303833
+33663765626533376331333634306433356636313337356138656463646638333563346635336536
+64316166353264353834666537663661336165383032366235623665326664313737396464363836
+61653362363436303361386136393562626434626165336362383764393234323138323832653761
+31623166376261613464313565663738366230346564656236633865663831383034666666376132
+30363437623263303366656565353665646265393331396433616461623536623564633336363638
+65343265636533333339356630316366343634663533623430633563313130653163363663373565
+34366237623833363863303837336565396461646634366136303465343130386436373033343834
+32323762393961663761303538666439323264363231663263653665393635376362326336623565
+66613862626436306466333564356331386364323134333230633936376131623034653432363761
+66343530316335386233353537343431363336386138353838633837626436653966386361393763
+66636666623037643036313034633537646466313930373230346134663032323434386565306131
+35393463666536663364396166393534323761386130383066663833373961313237336564306630
+34363939363431303366646230653435303437313636373466353930646565316336376264306165
+39663461343634373638656431656232363266383334653664616561396637666339386337356131
+31356333316363333336353963356633636162646462313131306132383138303733313032643466
+35316665343231643733363232306336373033383663633334346162336636633162346535616536
+32363735633963363037323439316266323535643832383335343131616431663561623736356637
+39663465373132633363623565363235653833383532356339616266653661333264316435323962
+65633462356438616161353436353831613332303233663335343538316266303433343537306130
+66613263373337646563353566616438656566303332396230306265623239353134656534376639
+31643064386131633430316262663431646661663963643736373965303032346563396566666465
+62336538313035626263666332386330356230633834306337346131306235663863376239326438
+33383137623265396432653134363161383031663062306462346433346135653566633862323437
+38663430346239303732623635353738303864623634663163393166666439396135356631333961
+37306431353836386138663334303235313731393131653262613936653936363739373637646230
+37343434393639343862363836633739326164643932666432613764373635393465383630303462
+63353631343338366133663432643637313366653765663439306162643966643365326566346561
+63306331386133393634303035393663613761333462363832323866336465316533323832613236
+66353934646136373438333463373638393561343130336138633731303161376139376232323439
+30396337613163663535396531633539393765316439323734353533303036303861326335343764
+66393333386465313038343536663437376138663035333061646261366266333134343863633636
+64366538333436396135653237313766633631386531336135623331653265383462376463313263
+36613335396661613236366632306637303434396136386633666132373061326134346232343132
+61353530663965373961663137353465646265356534313336383930666364623361636332373139
+39623933323835363537353839396538303238343633393863393832393464356364336466366536
+65616366343234316663346362363639303136313438643432646631343166333262633533636538
+65386164666366616662663234363239396462663666643534643365633962633139343037303766
+62663162653062373835613564366161343030333363626538663134313366356366373863343531
+64366430353038656464326561383439303564616531363265313231653866343838393432383563
+32313238666261393263653864643034643233653362303866613737616462313635666439306334
+31393263386439653434303962386633386463316231613261333837643539643461363761373261
+65313262623865623639636338666434616632363765646133303031666364646461326330383934
+33363837653962626135373730626162336365303665636131313564306532343062396435383932
+62633037363166656234303363396531653032616264346631353737636164303461316230613536
+65663934636131383839366565663130386333643465666366343831643562336234646430343565
+39363865326535383466643239353835366131306234383034626666316631366638393834633662
+65336632613636323737316165303937323734666365303635353665656636323336616662343466
+34316664366232663437333336656532323166346363386338323664666233363264316661666365
+32393861383834336631353365313832363330623364396562343564613862393538623131613339
+63303563383532306163376637626531646630333630643534303431306439356538353231313635
+32376563396332333136626533373231316661313836376532643039386237373066633263636531
+63356634646664303762343537303564343363363864336461633566333638303635376561363937
+64316265623439396661623862393639326631346366363561336561643161303966376135306631
+66323163363834373530363134393464663866303330623530383839613566376162613738363433
+32633633626137363234613061306137356237393566356264396366666566383231613332306237
+33343861646361373634656563666531396137363531636230343936653462383632363732643130
+35376532316135306464636261636462656464363061636165333835346538303564623631303539
+35373437396635363337356531316138353961343134303336653038306132613032373263636665
+33613931363066326230366564353339396336656239366539373737376134616362663963366264
+36343266326239343836343136626130376663353930653132646366343032613231643839626163
+38313938626535353735383939626666646439616138333465616239346361373437626139383166
+31323033636136376537373661643965343033363861643065303330313864363235316134366436
+61383930333531633130623033353532616131643935306635663962313633383932633430646238
+64653266313335613731373137613332643436386236333236666561313965386432303731656238
+34346662326437313333313939303533333339386135653161363366336335313261323136313539
+30313333326165326637376666373835626531633964626361383336623066363066313934636438
+64333462376637623130316363633133643337646266363736363839383633303365366334363436
+61313765343433666238333363386434373539393539326662383261663834363337666334373466
+38336461303763656562343133353139633033656130376266306538626334366564646332323333
+30373136373137353765336138393138306331643539346463393162363134353963366434333734
+61303062303032663661616465376461663832626335393465376130373466353636303033383733
+62303735383964363230333661356237383937616634633166663538323363633535323634616532
+36313337663663383938643331616639613732633630323037383339396332623231313531333331
+32343037653030663661366533333536336633373563383536656235316162663537323733636263
+32663939396463613732616565346166633238653838336365373838663637323439306236376535
+31626636656632346664613464373636333233656535346635353362363237626231303537306331
+37353365393534643730323937373636333135336539623262396661393530353330366564373662
+38333162313965653833313336656431326635333765626632653633663963333439343038323062
+31343939663161613338633036323836653436336532376266383230653137636432393761613335
+66356664373830613934666266333131393436623165373938323265656564306462663037303630
+36653433616233386535366531353733643130346265626433653563353565653565313166343466
+65633463623062373934383065366334663634633561343866386530373461636232313661323361
+61333263643433373834306164653832383337363236383363383137333232613862663761316239
+35363236363031323636623739646331333435306235323365323866366538646261613461336233
+64373936363463303662316535303066363864616435383461363164636639343965363132323561
+61613566316432326266633131653534386565343332303061323033643933316437643939376530
+36366431353432633834313964616264636536383632386330356335323733663166373334386164
+37653466393865666563346332633739643063636538323761323139363663323734323738343533
+62343362306432656237343836383530303630636230383665366532303136666635323565306364
+35646561393462663565343362376136646634373530393936373633653137616163663666363537
+64363465346564303965333561396536653234303632633766353362323030653334326230316465
+30353434356138623439356432303131623131633763396337363530623463636133356639656535
+33613264303439653164373430356536656331393161386534343635656534663862326564306561
+39343865393562363561306533616231666330616166306166303163353766393033323663633961
+62323864373636613139613835396138623163393466396136303437613738666638643335343935
+35663234333630613861383532613830663335653534623537623139656562326435373632366637
+39373638653665323137666361613030616132313039353535363330633264653439313432656236
+37343965353033363432613961623063363436386433383663353062626432373534626366393633
+34383535356365643430353563663864366464666430656339363030333431633133336265303332
+39343865323338356563613530656638383537386633653530396638393365613435666333393938
+63393961646632336566306437323236623730323737333536376531633462613263343565336136
+37356534326334313634636362343439663965336166383832326331396330343531616433643732
+65396336623163343037393234373038613932666265306130643064393864373166353339333164
+62623962653333613137363635336133613431303738333764383661363964343366303638396230
+33383237366161376634613836386239653036643766663466636333623861336464333133323364
+34663535393361376564396665323966343963343137613339626639666433316433656362383735
+33393862396362626138373637353761623939393736363133323734376232653232393864623865
+31396439623264653362326536356131393332646361333364396665363838316139363939353433
+39393031396565373637646236313531386632646665356565633034613832306130363635323639
+64633439373637623064366436663238633138653539376238663834636565313564363562646639
+37616137373437633031386137323361313638663330663561303533616537326631633232623538
+33393333353733376130366235616134623431326361363837386164336465373161663234623939
+33303834313238366434393835306232613963316666396136343735636238396433336261336363
+32366332383666663234393632303461383436383863646535616265616234376137656265646537
+34323164323662323638623031643036376533316364333835303337353461636636366134333763
+36613232396265626530363963333335623366343232663031663632646633386364393832353062
+62616431653435393762353433356337323939373536323239393566393234326537656466343335
+38366661373937626632616635656134386136336663633331336239303439343265336164313139
+35363965356235303664316332326236376536363932663562666430613563326564353530616233
+66376139626633366332356538356434393063383766623066653031353866393065303836616663
+66626636376331626138333965356436613839613037623863393336636533353037646632386461
+37363761366338633637656131333631376562393064346536653135313932623933623066303537
+64643937376163386565353637313966663461306161656433393135333861323035313235306431
+34303064653336656231613030323736346438636561383237396266373563653765336164376465
+33663838616663646433303664383036663361363333363064623131666331633031356636653031
+64643963626638303132333937643433646439386635643238643439393239653637656562373163
+39653432356162613566336434643238363938383039303165346237376630623766343165366162
+39346564616439613365623937303638666266626434656662376465656463643261356636356232
+37366430363339633939643539363934653336643266663537613336333137353731646635643330
+37363933363664656336613164623265316437316332333366663338303665383135366163396237
+39313634353630356161636536376132303933363437653161303833353963363432393730363935
+61353038386339336639326437353366313230333339393831303062333533623039306631346262
+36353632626364613464373363313465353932633562616335343133393362613836396634346630
+64666535346130343937633830306130313462323734316238386362363636376264643235353632
+64663662303532646331653061633333393539656331633236623235613434363662333435616234
+37386532633234646539633638343061336566613161373936636265316235636165653362353764
+33343039386136666335396635303139343138316233656139666437343336323838353637636265
+39636431353336643335616664323637626539326636356531373036633866333831393261653032
+30663234646330353362316531613364663733333237316161323534656365656231393230613639
+63366335353066646462303264373562363666396632373364653231323366383731656330643563
+37616435366364613133373664616239316435353031343939653462666539373639326162623730
+61333863623237316430666365363363656332303466303638633865303264653237376365313735
+39656531306538353361383136323666326232623838326264363939663837376632353236656164
+37326462303333326466393831383063316630356133396465613533373436376138343263376132
+66303436366538353965636465323363353831363838393136346435353939323831376539323436
+31386632633963383834366433663838376333386265623232376264653862653762363435393464
+37323033313861363738663331663462343032623035633536316235306566366133336163313639
+34393533646530623532343763306239363635303665373837313433356365633163646661656531
+62643035366262653534356139323238333637323761623636646131613938396634383465353437
+33336365363465386234633430333535373333363338333061396463313463396238643064313533
+36343564633265323530383930646433376439633335323836616266633066656130646632346338
+63626535376339373564656534643565623463663632643533333565623033363861626337336230
+37616465623538326665613865366264316363363435326636396366313465663361626236636266
+30303937376133653930383133656135326434653033373862346239666365393666356339646163
+34333636653765643833306630326533386436303632303861366161323062373530613763633439
+64393966636533303831396165613439666130373664323035666132333731643533636431353566
+38393766363766396631643834326534626338303163376431616334616461393135323135316630
+63343630363930383933363238663836653363363237663931323835326535323461636632326465
+33646138373430363361333730316430316339366131613430656363383935616661376465656430
+30653262366634346666616633306666396166343437666664626537616431636139643161393162
+65666435386333306634613436336337666164646261613831353830666662356265386661386439
+64393238653435313337363661366331386331386435643164633264373161656338626131666334
+38376535333230306633333532303862383633656364613135333233643638643830313565643133
+38323831323861623164353434393466346339303530653263386233343131623365356165346637
+37343233383138383066653365333538313233316430313332313864356531656466373737396162
+34373134636536396366663836393962303034656162333336666637373030623961316631326337
+63386433623933313135646438623339653437613232373961356262663934343064363566616363
+30326637376438666335323531343532383530623763363930313332323532383837333566663130
+36393763343966653766313631616432353165663730316166383931376462336636643762373533
+37373463646536366532646465656535316164333032343134356632613237303435336463363031
+37643764643034356430323938373966636361623632633333636335323335326662373538303838
+30373233383831373833643963636236363766643164346632643333323062613964373966386636
+38623934383733366331616166336461383230356563303431333561303132373363376266383330
+65653931316635303166646238613137363339633734386266643065643263623463656634316439
+65396330663732366465376166323566643636366165613630346636613064663534393835396631
+61613465313333623931353065373732393766396461306432663833396537363732353663613464
+39383665626635613438646631313661393931303263353034323534633565333136326438343834
+63663638363437646638663835613232616335313133386630336162343333303737356337303733
+32323932356433383761646539313936396165326536326663613235613937366661336233376463
+30656133393163306438323635323830323532316162393564646333373534616262633135373136
+30343633373533313831626137313436656134333234396136306465666234613036343164653239
+63623830323338623336373435366534343630373432353030396365306131353462383631393463
+61643132346463383235663662623266656534313434666631333766613234313337343436613338
+37373266303637363933376638316135343833303632336630353638306537636261626466373732
+33663738363935356331303733343939376235343766653237613531373662623366333136336333
+33616237623862316164306232363931353438336135336564636239363238623739636361353030
+34653234376133313037373532666437313539333866303432356163363837633462626266633837
+37303433336432656362653131356230356330633732386130623031346666383839383036623339
+34353035323662383839376130626338366539643532333037636563313532363562633238373564
+64366163373934396366656338643039323033383932393232333262393365363065323735353465
+36316632363930626337346565656531366134666465316239363564363565373766626566326263
+61386461316439623536383136333238643163346238373532363730306438636565376133653361
+64616432376564316435353837373835653730663363366631646133326132333961316336626132
+35346537303434633664336234626161616236653130633239653631636133353032336630626265
+39393766613432633035383533303735396634633336396664616266373966656137616365663063
+30633938653031356638373132306562313165663538613439393465316537343635333434333734
+37646561366164633464346465373063303262663330366136616565356430333239363862613563
+65633234383431393936373637386165623864333263646237663336313161646536366237666633
+62396437636435643338613930623135353663303634373036363730626262383231613665303961
+66666531333831303964636337373638336136656164363336373661326438353163316238313636
+63303363623864643538653433623333386362643839623462336239643533636135393232393936
+30303630383533643461393166636138376531616262656631323639616437313164396663306436
+38386533333666666338316662623033616331373763393966313062623866316438666437663365
+39663736656365633838313433303564653664356134376430636436363835303364383134653535
+62343138333631653561323130376635313539653239366130396262303264386531333465613065
+65653262336366613139616364626232313166636665633266346662643337363862363431616334
+36353431316431366437326537633161313761346532643865353663383763336462393438323762
+35323462666130613661393463643838356133643264303234353866343830393130306232653862
+33333066363236613339616333653964303562396430643637396430373532653463613665333032
+65303364353733626430353661383634313638633565333535643262333663343132393464653030
+61663164366535346666626330366430663363363631663265636637313431613635376666613038
+65623863393734626538646362616361323630323566663531633535363334346434313132386564
+39613763316563613639353162303637643939303539643934656532366336616330656461353336
+61336233396630656431363262623536393332616664386530353037323461346630613338646635
+38336362616433656362656236356638666136333231663766316534623061643135353132666236
+61346466636237316439306434343937363230636538306466646566623363376134326630323037
+33336561616134366437373430383762323065343638653535323764666461396139353462333732
+36383232376531396566616236393562393461383566366336323831393163623738386566373364
+33383563643566643737636535653861363532316161373730656633323032653535386238386362
+65653633313331656135646637323762633732353532623735643833633633313865623135316637
+65613565616338313563666363333463323761336337656537376532653466356232313937313964
+64316138386632613738306261613233373234306435623131643533646161656431626438663936
+63393561643235626439343062653761376336363235343032393030643166313066333562363962
+63373562656636353031636136376366396337353463633433326165326530323562363432356363
+35333732343335373534373230613935313862623233653632353066656363656232653662623830
+62623238613838666366316463656134613634623365353463306365396231653761653432353731
+63333739383931383162343761323463396638633231396333316536666536626131313266356233
+62306234623334393333323736363838376632356663353164393362613832643234393265313537
+33383164613537613665633866303735323436626564636139356664663463326332326166383033
+37366364633163366234626434653634616532643766646134633532646263316561356566306230
+63323138653032663138346432333338633763353164653961383162626330633334386263363465
+32323237366537376665633863346430346333643363376264323835306161653437663138643336
+31306263336330626433343733333931343231343662333937363038373561303965383736646564
+62663438643339663831623030346130306233623938363737336663333036396638383563393037
+65306266616438613034313932336536396564616162383566643531613237616539613632363463
+66333163346566663439663262613934623133643163313639363335303462656463613564643464
+61626639306231653534343334323732653936623839323565656137666338303338326338346537
+66326236613662663731353366623862653063303130663034346137323564343836666537343930
+63366239613862626134323837376638326234643634353436383461313732383636303764353135
+37326232653136663335643061663139356461313930383762333538636232623730316362383966
+34623465323834333431656539663763346662613764393139653533303864373336336262653436
+37363433666462323138323063306162666135343766623562373565623664353163356333636430
+66623937326633363465643737653435393439666235393166366533313835316662663461373164
+36646662383661333039626533376130343039306231643465333737336163373365653231613838
+32346666613736383632343566313130363236303739363635393462663934666163356633616162
+62313666303637653137633461346439666363636631326462353930373231316163613537383165
+30626332366563386437346338353330383830303834613762373938663831333434633937663936
+30616634643030313664306533633038393331336630666435303330373932626138313330303135
+63396330656530306133633764653638663761326363663865376330356131623035386239623236
+39396265303637363135623365306434323739316661393435373731306438633665333864666131
+34643235396463386662643837623964623332663634303430386662393262643735396334656366
+33653230356365613865353932393963326262323365656561363338336632323837306432633135
+65313062643536616236636565383063353662336638366530313633616538363061386663386435
+62323631626463323564353939643664373534316363646465633438313464383061653831363364
+32623865303637323433666665643662393438383231336335373237303638333130316231666139
+31366137663766383237623465363734333739376232653863373539663337623633393434303765
+38653638336563336661626338303863636263393833363062363232306661343738303264633465
+66333531303432376463323466366638613864323439613136323866626433383262303234376331
+30613838643565313861626235626534373831663566623364313837383631346265353562383964
+30386565646537383933626432303762356530353862656461363030366639313333353336363835
+38613637383633633733626638383933616566616534383466393735376565306438333461626162
+36663133363439383862623838636230653236376537633863383564393964633236306637336465
+30373034663831343033363464636464373633366539646531633062303663353131636465313332
+66623665376534366134353330666566656438613439656636323564613564663063313331356133
+35666339633264613236303737373232666333386535313638326232306434356263396535303062
+62306230336531323435363638663261353264366363393731313038613661356264336166643135
+63306366353463353934623039643037393966383731306430623362663038376565633231636166
+66393262616635396138333561303038323633663834386261393966663533313834376535353333
+36386664633932363238663766653237303432383330353763373332313237613831636532326230
+63323033663730393364633363386263333766653431623538323563353235326336373663623261
+64326335363364643135336533386430636139326337346437316436326231636532306338306161
+32633236613433636134653965326236653062363962613732306266323834306430303639326437
+31383439336664643939346165393936616339353437666534303434613365636566393435333665
+33333130383036396566613834316464616264633966396138306236333665333165633032356231
+66313030343530613232396562343864343637363035393939373936363936613934636666303464
+31333533623365396431393466336165656237366630653763336134363536363130323337383535
+32313938626433393835373939636435353633303636313733653133363261376334633764346130
+34333862633433613564316261313438656339613335373237316461666462356536353735383064
+32623233313862306365656365626232386439613262666563636466373830633436373832613863
+65656531366165353431613335323861643961376633356136666332656634326361366464636631
+64653161326633313630313431323635373831313938626638663330613562333863343235636366
+38653836366536373838653231646138643536353761383136653563373333633737363263646564
+62636266343237393766643965303561666463306334376665323531356430303261306435323466
+30623863326431313862623765373666336639616636396530656539616335363364323939393331
+64303339383565383330356130613932626234303732383731383539366237346436643138633730
+61666132353437383330656333353837663964313631303331356330356539356435653264666338
+63626662373962613836363237356230383939613434326635373333343234646663313965363730
+37393336326539633336666666626533623531343365363563356535653331616336313335323930
+33353034356337323838393864333530303366623032316665366261663638333966393337326561
+39333036313035356164313566306438316331336431666336663332643664643031643030343537
+36333364663331366465316634383030623165346237383336333236633062376232333939376237
+38313834616638313064366438666138356336636535613534313262383066363439343933383931
+65666638373938376133663839313064383966323262626330633665313462656366373563306565
+33623161623838326434666365656133613864356431323432653462346133326430366236333666
+34316462303164656164393465396133643061356364363135626534626565336339643637343334
+38646238613531636532356466326263393238373962623238346131343737653834356535653834
+33653266343730346134633831396361353334393764353733373636383631333838336331636636
+64383763303766396332303830363132633361646531343261383339346537613961326231383732
+32306631343739303431633639616162356461626466636336653035653332313831653364373839
+63393366616438366632373231363166336465323765613632393039363765366239363031626165
+36336461343665663964323738316133656530316663643831613331333133623231326661346236
+34663032613733376664323938303939626238373437383233326630333634383232303264313939
+63343665353435316238313736663735346237343864646334383039656362313761383832383162
+39643262626533653939626364613730616233613938626566363464633530623431613865336537
+62306532623061373135396639643736383536356133326230393239613937626463333831316431
+63666333393237313061396637343037336436613133343039656265363739636638393236306535
+31336430356538326136386633656138373637393833393631303838643736623631386261326161
+38366463643734326331663465326136663335386561396235393066333834646536326562663537
+66626132326635636430643561393134396435616565376134666565353038613637643165613935
+35363237366165613964653461323132323163623536393031363638353136326635633462376537
+34616137636162346266376237393064646461326234653763653637623630386661336561663066
+61333063626132353036633464643135646632306136656331643432666336646536653736386666
+38623661616435303439373230616336666537653262613234633730613331336166613434343238
+34653234323932343939653164386638393537303663633132383963666362653530613138343362
+33393331356338333634666463663932306432623361666534333065313764373537613963656331
+39363232343264343863393431323564653232343732363161643564663933653965336632653930
+63346531346235363732326435353038663361306539336632393330313030363562626666336562
+36303231656334316337386230633339613533636430613739393139643061393361313937356238
+66323933323934653636373239353162363034323334333030616562393832306635343166326534
+61343130633665616630633838623462396266303039623031313332363631643861313230366133
+32623766343363373034313732356565386637303331326133653966393738656535613064393061
+38363530636236376235376431303962336231383635393163383333653963326632343931616166
+32343666353966383964626561376362343265666133633161303131353438653939383536353232
+32323835386431326138373239393737396664333538333934343534376431623130656437316238
+36353131333966636665623139343636356436323038366132643265643835383263636264353934
+37356564313036663035613834333534303839323166666138636136316631376235646463656536
+31343033373839396564653966613734623265393133653932303362656534633461393238643131
+30323566633862626232363439613531376561643032353365623362393939323931376562663463
+33306530633639313738313662343636633931643736343664363362656466646535626533303766
+37373734356535303037393666666363626661376132363934633664343864353133356262366565
+37646163323835633965343932366165663831663035656437363235353535653165356631343937
+62626564323137333464313762333966353666663338396566336639333133383838353739373164
+64386665306164366137373265343165383036623761313339616364666232616536643837626338
+35656366306438343933663133306264323962653462336336323239633061663030653537666533
+31373733303763653139653432663636653837333964613538396661376235366264346663303534
+35396264313936656138373865356532613563316638666165643262316465616566323535623731
+33646163646330376230363165363239653464393632663062663536636463333563616462333534
+37613364306533386633613436643266343132376636336361393833376161353762366235336561
+33373165393733306162346535306566653935666533623237666131623735336162393334653662
+39633265376530376237396563363338373434356237323034356634363265666230326533336238
+35303634643339633436343838663461343834303939366263393938343461623136646661613466
+39353230616331376231303936613439343965643931623330353633323736376363353031316261
+31643535306534626362633436643137646232343464333562326334343639613634306262356264
+62396436666131326637626364626433396262663061356635613732623061303765633065376336
+37316363633034623838393635626161386162313165316564373662386333353831646439653764
+66346432333337393666346334613430623739313364356434616261343739393464376362373733
+34373938383561363833366337343162386635326135646532326333646133336630393663666532
+62666237656662336438303230323839353031396166396462356563326332343232323466616234
+36386135313564666430303262346364616261613566636230643736383532646436353066383930
+35396330666166663663313739626262643533623233623566646130656166663234656165626662
+66613530623365333033373338376135393231316462343933393233656162343665353661383562
+31303134386637643363646363323766643533313337316666343332393133343666306132366639
+66343464376633626164383866643030346135396435643130356330656335363137356361616339
+64303636616633633062613265336238323133653832346438363366323836386662313063313330
+33303065376131376363343839366131613231653331333262656464313737663030313531396464
+31373531393739623239336135353066383265653464643731303261323638393039313832313761
+63373864353935336262643133356333666563353339336163666338613264343233393066646138
+38613436393066376338633334373033363638366539633736396536653533643736333431316133
+37373035353330316361656166326138663031393563306461643533363736616365636435363632
+33323132306165373436643234666561623766376432323935343361666266343563333332633137
+36636337613566333663643831333935666565326166383138353064326631343135666331336435
+36653038636162323939393963316335653234616362613230653730633237613935663365386437
+30616232366538613161396339303636326437623031326435396366316363666338316635636132
+32643934303630313563306233643862376366326561393534613761643730383038613566306336
+62393335666363666233313437636365393935393364623264373534666465333337656638633438
+33616665303263326134356663356133303136343834623430383932353433653766616135396263
+66633535383436346265353966376261313432636339643439323630623835393765326434343437
+62336332616137353938633662376366623435326539316663623364333861653464373630633236
+65653133376665626337323265353438666338313238613563626562383964663237333962316237
+35666262306334633862623263646666386432613633613933343637616635643862363036373464
+32616564646662326166323330343562366630616232663630363231366634373037313066623866
+30653433353631333634373465313737363139363737316436643138383739306265643133393036
+38376563633235383764303931643936663137363339643336663039333335363565306263656462
+36333431306365663138653134663837656538386366343962303764383365663336653864613763
+30333734353364636464643835353261343964303166343031353065353761323061313962663062
+37323738633332633330333332333537373863373437353236666538323130326137626665336539
+30623963393166643030303837623462333266653833633664656130303563373862636633373938
+62653465343866363234366537353734333837306464396433373535366535386634333163303461
+63633630366164633162303238353137313731663833333038303235356638353336633539646161
+34636238363264653634393565376164643139396166333162326236313236306563323563626633
+38363836323739313666366133343865313433666234396433376230626631643539313662626538
+65326664613266643466613533313934336266303131636230316430386638373334386433356662
+62333738633933336366373835333939623133646633663063383131386163653332383364626664
+62333335343538383662353861626462353637633432376565623766353362663234633830323433
+37386236363830373261643662656639323665656235613465366131633462663433323035366264
+65666630393461393762656538623238656437666135306662353338343439366530383336346661
+63326365613334666266306533643036333336623261326135363039643966316361666562376461
+64656562393333343766303136366235663337303561326365316664653665363033366138366662
+38656238313364373561313539303933613463623261393839356265633937326435663239303662
+32356536366634363064323262336530393163383263633965353238343534353230306231626464
+31376336323864323461306462343766363765323537313938333665666539663735623161303866
+62343061346664323138333136643263353331343462313666306131333936383630386137383136
+66313430616137386539623739616531326137393966393066646463306638643330393964376563
+39306635333337323234346633353138663366646561353861633438666332646634373563366361
+61396139643061303962656637363961623163663565306536333963613033646133313564383333
+35653962666263336364346265616633636163616263393336623766316437666165323336656662
+64363561363336393936363538363966393039396333363132363938333432653235353637313134
+33303732343537636433336234663262616239616334363933616636316464343562633430323865
+33393566343038346436346330666164356165303039346333323761623731636138663862316434
+31313331386364343738643031303539353766386337383863623163616233323665363632316664
+33626531653732353632623032343161303337373135306236326365326361666535636436313934
+65306566326663346136646366616636623632383537323738383237343465386430313232316432
+30646535633332646639376464616266393131363962386237343663643738393365633331613465
+61663138363963643933323836383434623061326231626665333362353934366264653262386538
+31353433316138613038626638613133373663343864653565376433316333376436386262633639
+39633964373833306565333636633535336138373533663834353862326139333230636464323165
+64306564376137656130333239643132326537363932666335343730353331666464363931616536
+64306265356535623466326633643161666164326131343738383866623038643763636338643062
+30653263653338383962303139353337663039383434333033353966323537623632316630373437
+35313831313638613961393765313135346436393833383630346432363734336465336434303762
+64363564616630666230313463626532633730386339343832623735323334656330336663366466
+34363463623662353163333665336566643232636432646464353561613339303066666633633266
+38666438373962376263383065376266393930383838396533366432616263336431653038316533
+33346231386633623265396138666166333266653038386237326133366265653263363061643433
+61383962653135383939373934386539666162623163663737343539613061656630363636356331
+65323362373264393930643936306565333239653337663737646665353930306331336139653432
+34386431323438313165333831663062656464663162363565663438353964613835303536303937
+34343038333834616665373033386466383863376130656230363638316537626666373135633438
+39626130303937346165356666343733353631646533303431346231326563306461623031623930
+37633938633061666663376232306234336434363533626432303539363432386532306232336664
+32623037643265663465393864646163613436346165373037383665303966656565323664366436
+38323764626538663235383064653937346534393333623931616234396133373930656664653630
+36666165653930363966373631383931346437376164396438353139396232633734663564323735
+66366665396630373932343864396437353661373565646466316563383434336532373862633837
+37666433646333303439313933616261616634643739643463383466666332323962643331323637
+37653266646234363964663565356430336135313765626337383933366435616261333564376365
+36636462313432373663376265656330376636356232333831653964386463353336656563323235
+34656563323839643565623038643939333938313862666534386539653366316432326461326531
+61633437356530623462623362643739623565333165393432376238336463616339373966613933
+65666336613766383331323262306161616335613462333439303763376161373264623463306531
+33393131303932653861653838336439396633646465333332663637636162316662626632363731
+32373032346139616238326438663237383763343735316261333335353634303964323933333361
+61343263336165306235383562653734323664323133363733666630383561636637346238363038
+34626239323239663439363063323030386466613365383263623266643630356336383630336465
+33393539643566373762313036363436663137383865326231333631623734656535356331623239
+36306431313832363037666538626438623066363137376330323361656466316637336534363931
+62386334303039346561643561353662303139333564636463663461356166653336323334323033
+38636430343132383038636632616564386631313663656330343761646563383039666439373861
+33376138363633636135613030373961626362653436663537663663313266373031366266346634
+65353839663264643263343561306362323534306632316161366137643665393135306666343662
+39326638333161353462393837306332376338353137383262306164323332303061366339613961
+33356335323036373332343038646163316239343564363232663137646662666263393765663661
+61363330346466613634326539646135386433383433303339323536333435303631393239356339
+63336662333965376366353232633665346237663835333164393035333630653861343534656261
+35383665343564343132366661626463383236616231396265613531613862646164653435626433
+32363136383064396433636432396532623535313664316465663837626236356336326461636235
+31613731313032343634366234393736343836616538333731363734653131623664346634323535
+64333961633236313737393933626339303030313265316135323837613033616332626137323938
+35666332313430376637343336366236383330333865653565656230303036396637343630303834
+64346461316133666365386331303366323231376465393139376566666539656238623161353639
+62653233336132306134326232656233373133333834636138636531323138353430653762323034
+64653632356535313866343765376465363432376535363939356431363264353139313365663734
+64323732343536626232356264613136643661376363323361353731333235663431393663396334
+35663963363935346333643161316538646530356164346365663466353565373763613233386536
+34356666623135396431303765363138346437626439633432353633323837653132303066363861
+36363338393565333131343236323833646665353834643238653831323537663664633966356133
+66633837623461643362623337323931643338316438393765336538666434393930313663633665
+36376264316362386661333563366137666463376237323836373963613437633633363664343031
+32613963373931366163616436366339633939353534396464346232636164613138656664343230
+39316539663862636663643861343136333065326136663863333631653563336562666634646339
+61313537363530383935656233633535333634363838386630616561396539643061653036656339
+31633833623564313036353466333538633761363034353232653234306232336661316237643737
+63336633316562333130633838643034353264353331616566633935643234616565313734613063
+36633334306433623965636364653735313739313963326538646633326461386437303136373336
+61643934663364333838633466363466643037396563623734343839343436613537363663633235
+63303433316166336432613064663139363264633963616366316664356232623664333838306335
+37356534363764653439336532343363643065383366373934636262633835656232323530343933
+31666638356138333564636561363731353366306163633665613538386533613830666438663731
+33386464356665306263626162313965353433343832383464626265363261316537396236393661
+61326538326431343037363632616237646636303563623061393666623235323662653961626335
+33623362326538353636363531633839363364613837643731353961333963353836303830656339
+37643938653064633766373764316233396365343265643637373133633534393238346332643231
+66613337353662323663653066393165386663353634336137663039343933616436383432663064
+61656634313736633630346534333234656632396463383131663363303236333966313531333666
+39626438366430373038356136303162653530313031333962643538396363343830646434316531
+373163643837303136633832363963303664
diff --git a/lmn-client.yml b/lmn-client.yml
index 5584d6e..0224455 100644
--- a/lmn-client.yml
+++ b/lmn-client.yml
@@ -63,7 +63,7 @@
- role: lmn_localhome
when: localhome
- role: lmn_localuser
- when: localuser
+ when: localuser|bool
- role: lmn_exam
when: exam_mode
- role: lmn_wlan
diff --git a/misc/vm/Netzlaufwerke neu verbinden.lnk b/misc/vm/Netzlaufwerke neu verbinden.lnk
new file mode 100755
index 0000000..e2fe26b
Binary files /dev/null and b/misc/vm/Netzlaufwerke neu verbinden.lnk differ
diff --git a/misc/vm/injector.ps1 b/misc/vm/injector.ps1
new file mode 100644
index 0000000..4c785cf
--- /dev/null
+++ b/misc/vm/injector.ps1
@@ -0,0 +1,155 @@
+param(
+ [string]$ticketb64
+)
+# BASE64
+$ticket = New-Object System.Byte
+#reading from b64
+$ticket = [System.Convert]::FromBase64String($ticketb64)
+if ($ticket -eq $null){
+ write-host "[-] Be Sure entering the correct mode"
+ write-host "[-] Cannot receive ticket from file or b64"
+ exit;
+}
+
+
+# ------------------- FUNCTIONS -----------------------#
+$ptt = @"
+[StructLayout(LayoutKind.Sequential)]
+public struct LUID
+{
+ public UInt32 LowPart;
+ public Int32 HighPart;
+}
+public enum KERB_PROTOCOL_MESSAGE_TYPE
+{
+ KerbDebugRequestMessage,
+ KerbQueryTicketCacheMessage,
+ KerbChangeMachinePasswordMessage,
+ KerbVerifyPacMessage,
+ KerbRetrieveTicketMessage,
+ KerbUpdateAddressesMessage,
+ KerbPurgeTicketCacheMessage,
+ KerbChangePasswordMessage,
+ KerbRetrieveEncodedTicketMessage,
+ KerbDecryptDataMessage,
+ KerbAddBindingCacheEntryMessage,
+ KerbSetPasswordMessage,
+ KerbSetPasswordExMessage,
+ KerbVerifyCredentialMessage,
+ KerbQueryTicketCacheExMessage,
+ KerbPurgeTicketCacheExMessage,
+ KerbRefreshSmartcardCredentialsMessage,
+ KerbAddExtraCredentialsMessage,
+ KerbQuerySupplementalCredentialsMessage,
+ KerbTransferCredentialsMessage,
+ KerbQueryTicketCacheEx2Message,
+ KerbSubmitTicketMessage,
+ KerbAddExtraCredentialsExMessage
+}
+[StructLayout(LayoutKind.Sequential)]
+public struct KERB_CRYPTO_KEY32
+{
+ public int KeyType;
+ public int Length;
+ public int Offset;
+}
+[StructLayout(LayoutKind.Sequential)]
+public struct KERB_SUBMIT_TKT_REQUEST
+{
+ public KERB_PROTOCOL_MESSAGE_TYPE MessageType;
+ public LUID LogonId;
+ public int Flags;
+ public KERB_CRYPTO_KEY32 Key;
+ public int KerbCredSize;
+ public int KerbCredOffset;
+}
+[StructLayout(LayoutKind.Sequential)]
+public struct LSA_STRING_IN
+{
+ public ushort Length;
+ public ushort MaximumLength;
+ public IntPtr buffer;
+}
+[DllImport("secur32.dll", SetLastError=false)]
+public static extern int LsaLookupAuthenticationPackage([In] IntPtr LsaHandle,[In] ref LSA_STRING_IN PackageName,[Out] out UInt32 AuthenticationPackage);
+[DllImport("Secur32.dll", SetLastError = true)]
+public static extern int LsaCallAuthenticationPackage(IntPtr LsaHandle,uint AuthenticationPackage,IntPtr ProtocolSubmitBuffer,int SubmitBufferLength,out IntPtr ProtocolReturnBuffer,out ulong ReturnBufferLength,out int ProtocolStatus);
+[DllImport("secur32.dll", SetLastError=false)]
+public static extern int LsaConnectUntrusted([Out] out IntPtr LsaHandle);
+[DllImport("secur32.dll", SetLastError=false)]
+public static extern int LsaDeregisterLogonProcess([In] IntPtr LsaHandle);
+[DllImport("advapi32.dll", SetLastError=true)]
+public static extern uint LsaNtStatusToWinError(uint status);
+"@
+
+
+Function ConnectToLsa()
+{
+$lsahandle = New-Object System.IntPtr
+[int]$retcode = [KRB.PTT]::LsaConnectUntrusted([ref]$lsahandle)
+if ($retcode -ne 0){
+ write-host "[-] LsaConnectUntrusted Error (NTSTATUS): ", $retcode -ForegroundColor Red
+ exit;
+}
+return $lsahandle
+}
+
+#-------------------------------- ENTRY POINT ----------------------------#
+
+$assemblies = [System.Reflection.Assembly]::LoadWithPartialName("System.Security.Principal")
+Add-Type -MemberDefinition $ptt -Namespace "KRB" -Name "PTT" -ReferencedAssemblies $assemblies.location -UsingNamespace System.Security.Principal
+# CONNECTING TO LSA
+$LsaHandle = ConnectToLsa
+write-host "[?] LSA HANDLE: ", $LsaHandle
+# EXTRACTING KERBEROS AP
+$retcode = New-Object System.Int32
+$authPackage = New-Object System.Int32
+$name = "kerberos"
+$importnantlsastring = New-Object KRB.PTT+LSA_STRING_IN
+$importnantlsastring.Length = [uint16]$name.Length
+$importnantlsastring.MaximumLength = [uint16]($name.Length + 1)
+$importnantlsastring.buffer = [System.Runtime.InteropServices.Marshal]::StringToHGlobalAnsi($name)
+$retcode = [KRB.PTT]::LsaLookupAuthenticationPackage($lsaHandle,[ref]$importnantlsastring,[ref]$authPackage)
+if ($retcode -ne 0){
+write-host "[-] Error LsaLookupAuthPckg (NTSTATUS): ", $retcode -ForegroundColor Red
+exit;
+}
+write-host "[?] Kerberos Package: ", $authPackage
+# GETTING CURRENT LUID (INJECT PURPOSES)
+$output = klist
+$CurrLuid = $output.split("`n")[1].split(":")[1]
+$sysIntCurrLuid = [convert]::ToInt32($CurrLuid,16)
+$luidFinally = New-Object KRB.PTT+LUID
+$luidFinally.LowPart = $sysIntCurrLuid
+
+# TICKET INJECTING
+$protocolReturnBuffer = New-Object System.IntPtr
+$ReturnBufferLength = New-Object System.Int32
+$ProtocolStatus = New-Object System.Int32
+$KrbRequestInfo = New-Object KRB.PTT+KERB_SUBMIT_TKT_REQUEST
+$KrbRequestInfoType = $KrbRequestInfo.getType()
+$KrbRequestInfo.MessageType = [KRB.PTT+KERB_PROTOCOL_MESSAGE_TYPE]::KerbSubmitTicketMessage
+$KrbRequestInfo.KerbCredSize = $ticket.Length
+$KrbRequestInfo.KerbCredOffset = [System.Runtime.InteropServices.Marshal]::SizeOf([type]$KrbRequestInfoType)
+$KrbRequestInfo.LogonId = $luidFinally
+$inputBufferSize = [System.Runtime.InteropServices.Marshal]::SizeOf([type]$KrbRequestInfoType) + $ticket.Length
+$inputBuffer = [System.Runtime.InteropServices.Marshal]::AllocHGlobal($inputBufferSize)
+[System.Runtime.InteropServices.Marshal]::StructureToPtr($KrbRequestInfo,$inputBuffer,$false)
+[System.IntPtr]$PtrToCred = $inputBuffer.ToInt64() + $KrbRequestInfo.KerbCredOffset
+[System.Runtime.InteropServices.Marshal]::Copy($ticket,0,$PtrToCred,$ticket.Length)
+$ntstatus = [KRB.PTT]::LsaCallAuthenticationPackage($lsaHandle,$authPackage,$inputBuffer,$inputBufferSize,[ref]$protocolReturnBuffer,[ref]$ReturnBufferLength,[ref]$ProtocolStatus)
+if(($ProtocolStatus -ne 0) -or ($ntstatus -ne 0))
+{
+ Write-Host "[!] Error in LsaCallAuthenticationPackage" -ForegroundColor Red
+ write-host " NTSTATUS: ", $ntstatus, " Protocol Status: ", $ProtocolStatus
+ if ($ProtocolStatus -eq -1073741517){
+ " Ticket may be out of date"
+ }
+ exit;
+}
+if($inputBuffer -ne [System.IntPtr]::Zero)
+{
+ [System.Runtime.InteropServices.Marshal]::FreeHGlobal($inputBuffer)
+ [System.Object]$ticket = $null
+}
+klist
diff --git a/misc/vm/vm-prepare-sys.ps1 b/misc/vm/vm-prepare-sys.ps1
new file mode 100644
index 0000000..ad8f16f
--- /dev/null
+++ b/misc/vm/vm-prepare-sys.ps1
@@ -0,0 +1,73 @@
+# Installiere alle Mounts aus target.csv
+# Geprüft wird, ob das Laufwerk bereits vorhanden
+# 11.05.2025 da
+
+function Mount-Drive {
+ param (
+ [string]$DriveLetter,
+ [string]$TargetPath
+ )
+
+ try {
+ & "C:\Program Files (x86)\WinFsp\bin\launchctl-x64.exe" start virtiofs viofs$DriveLetter $TargetPath \\.\${DriveLetter}:
+ Write-Verbose "Laufwerk hinzugefügt: $DriveLetter"
+ } catch {
+ Write-Error "Fehler beim Hinzufügen des Laufwerks ${DriveLetter}: $_"
+ }
+}
+
+function Import-VMInfo {
+ param (
+ [string]$Path
+ )
+
+ if (Test-Path $Path) {
+ return Get-Content -Path $Path -Raw | ConvertFrom-Json
+ } else {
+ Write-Error "Fehler beim Einlesen der VMInfo Datei ($Path nicht gefunden)."
+ Write-Error "Tipp: Beim Neustart der VM wird diese Datei neu angelegt."
+ Pause
+ exit
+ }
+}
+
+# Laufwerk Y: mit weiteren Mountpoint-Infos mounten
+& "C:\Program Files\Virtio-Win\VioFS\virtiofs.exe" -m Y:
+#Mount-Drive -DriveLetter "Y" -TargetPath "VM-Data"
+
+# VMInfo aus JSON File einlesen
+$VMInfoPath = "Y:\.vminfo.json"
+# Schleife, die auf das Laufwerk wartet
+while (-not (Test-Path $VMInfoPath)) {
+ Write-Host "Warte auf $VMInfoPath..."
+ Start-Sleep -Seconds 1
+}
+$VMInfo = Import-VMInfo -Path $VMInfoPath
+
+# Weitere Laufwerke einbinden
+#foreach ($virtiofs in $VMInfo.VirtioFS) {
+# $targetDrive = $virtiofs.Drive
+# if (-not (Get-PSDrive -Name $targetDrive -ErrorAction SilentlyContinue)) {
+# Mount-Drive -DriveLetter $targetDrive -TargetPath $virtiofs.Target
+# } else {
+# Write-Error "Laufwerk bereits vorhanden: $targetDrive"
+# }
+#}
+
+# Drucker installieren
+foreach ($drucker in $VMInfo.Printers) {
+ # Überprüfen, ob der Drucker bereits vorhanden ist
+ $druckerName = $drucker.Name
+ $druckerVorhanden = Get-Printer | Where-Object { $_.Name -eq $druckerName }
+
+ # Umwandlung in HTTP-URL
+ $httpUrl = $drucker.IppURL -replace "ipp://", "http://" -replace "122.1", "122.1:631"
+
+ if (-not $druckerVorhanden) {
+ # Drucker hinzufügen, wenn er nicht vorhanden ist
+ Add-Printer -PortName $httpUrl -Name $druckerName -DriverName "Microsoft IPP Class Driver"
+ Write-Host "Drucker hinzugefuegt: $druckerName"
+ } else {
+ Write-Host "Drucker bereits vorhanden: $druckerName"
+ }
+}
diff --git a/misc/vm/vm-prepare-sys.xml b/misc/vm/vm-prepare-sys.xml
new file mode 100755
index 0000000..b00a30e
Binary files /dev/null and b/misc/vm/vm-prepare-sys.xml differ
diff --git a/misc/vm/vm-prepare-user.ps1 b/misc/vm/vm-prepare-user.ps1
new file mode 100644
index 0000000..15b540a
--- /dev/null
+++ b/misc/vm/vm-prepare-user.ps1
@@ -0,0 +1,102 @@
+# Installiere alle Mounts aus target.csv
+# Geprüft wird, ob das Laufwerk bereits vorhanden
+# 11.05.2025 da
+
+function Import-VMInfo {
+ param (
+ [string]$Path
+ )
+
+ if (Test-Path $Path) {
+ return Get-Content -Path $Path -Raw | ConvertFrom-Json
+ } else {
+ Write-Error "Fehler beim Einlesen der VMInfo Datei ($Path nicht gefunden)."
+ Write-Error "Tipp: Beim Neustart der VM wird diese Datei neu angelegt."
+ Pause
+ exit
+ }
+}
+
+function Add-PathToQuickAccess([string[]]$path){
+ $path | %{
+ write-host "Adding path '$($_)' to Quick acccess list." -F Green
+ try{
+ $link = (New-Object -Com Shell.Application).NameSpace($_).Self
+ if(!$link){throw "Item path not valid to be pinned."}
+ $link.Verbs()| ?{$_.Name.replace('&','') -match 'An Schnellzugriff anheften|Pin to Quick access'} | %{$_.DoIt()}
+ }catch{
+ write-error "Error adding path. $($_.Exception.Message)"
+ }
+ }
+}
+
+$VMInfoPath = "Y:\.vminfo.json"
+
+# Schleife, die auf das Laufwerk wartet
+while (-not (Test-Path $VMInfoPath)) {
+ Write-Host "Warte auf $VMInfoPath..."
+ Start-Sleep -Seconds 1
+}
+
+# VMInfo aus JSON File einlesen
+$VMInfo = Import-VMInfo -Path $VMInfoPath
+
+& $PSScriptRoot\injector.ps1 $VMInfo.krb5.cred
+$klistOutput = klist
+
+$serverping = Test-Connection -ComputerName "server.pn.steinbeis.schule" -Count 2 -Quiet
+if ($serverping) {
+ if ($klistOutput -like "*Client*") {
+ foreach ($Mount in $VMInfo.Mounts) {
+ net use /persistent:no "$($Mount.Drive):" "$($Mount.RemotePath)"
+ #New-SMBMapping -Localpath "$($Mount.Drive):" -Remotepath $Mount.RemotePath
+ Write-Host("net use $($Mount.Drive): $($Mount.RemotePath)")
+ }
+ } else {
+ #if (-not ($klistOutput -like "*Client*") -or (-not (Test-Path "H:"))) {
+ $Credential = Get-Credential -Message "Die automatische Einbindung der Netzlaufwerke ist fehlgeschlagen.`nBitte geben Sie Ihre Anmeldeinformationen für das Netzlaufwerk ein" $VMInfo.User
+ # Laufwerke einbinden
+ foreach ($Mount in $VMInfo.Mounts) {
+ net use /persistent:no "$($Mount.Drive):" "$($Mount.RemotePath)" /user:"$($Credential.UserName)" "$($Credential.GetNetworkCredential().Password)"
+ Write-Host("net use /persistent:no `"$($Mount.Drive):`" `"$($Mount.RemotePath)`"")
+ #New-SMBMapping -Localpath "$($Mount.Drive):" -Remotepath "$($Mount.RemotePath)" -UserName "$($Credential.UserName)" -Password "$($Credential.GetNetworkCredential().Password)"
+ #Write-Host("New-SMBMapping -Localpath $($Mount.Drive): -Remotepath $Mount.RemotePath")
+ }
+ }
+} else {
+ Add-Type -AssemblyName System.Windows.Forms
+ $message = "Der Server kann derzeit nicht erreicht werden.`nDaher können die Netzlaufwerke derzeit nicht verbunden werden.`nVersuchen Sie es zu einem späteren Zeitpunkt erneut mit dem Skript: Netzlaufwerke-verbinden"
+ $title = "Server nicht erreichbar"
+ [System.Windows.Forms.MessageBox]::Show($message, $title, [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Warning)
+}
+
+# Ändere den Namen der Netzlaufwerke
+$shell = New-Object -ComObject Shell.Application
+foreach ($Mount in $VMInfo.Mounts) {
+ $folder = $shell.Namespace("$($Mount.Drive):")
+ if ($folder) {
+ $folder.Self.Name = $Mount.Name
+ Write-Host "Das Netzlaufwerk $($Mount.Drive): wurde in '$($Mount.Name)' umbenannt."
+ } else {
+ Write-Host "Fehler beim Zugriff auf das Netzlaufwerk."
+ }
+}
+
+# Pfade zur Schnellzugriff hinzufügen
+Add-PathToQuickAccess $VMInfo.QuickAccess
+
+# Pfade für Standardorte ändern
+$regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
+foreach ($USF in $VMInfo.UserShellFolders) {
+ Write-Host "Set-ItemProperty -Path $regPath -Name $($USF.Name) -Value $($USF.Path)"
+ Set-ItemProperty -Path $regPath -Name "$($USF.Name)" -Value "$($USF.Path)"
+}
+
+# Explorer Neustart erzwingen (evtl. nicht notwendig)
+Stop-Process -Name explorer -Force
+# Start-Process explorer
+
+# Bei Lehrern Papercut-Client starten
+if (($VMInfo.Groups -contains "teachers") -and -not (Get-Process -Name pc-client -ErrorAction SilentlyContinue)) {
+ & "C:\custom\papercut\pc-client.exe" -m --user $VMInfo.User
+}
diff --git a/misc/vm/vm-prepare-user.xml b/misc/vm/vm-prepare-user.xml
new file mode 100755
index 0000000..f3f8854
Binary files /dev/null and b/misc/vm/vm-prepare-user.xml differ
diff --git a/misc/vm/vm-update-user.ps1 b/misc/vm/vm-update-user.ps1
new file mode 100644
index 0000000..c3036d5
--- /dev/null
+++ b/misc/vm/vm-update-user.ps1
@@ -0,0 +1,30 @@
+# Injects krb5-credential from .vminfo.json if available
+# 02.07.2025 da
+
+function Import-VMInfo {
+ param (
+ [string]$Path
+ )
+
+ if (Test-Path $Path) {
+ return Get-Content -Path $Path -Raw | ConvertFrom-Json
+ } else {
+ Write-Error "Fehler beim Einlesen der VMInfo Datei ($Path nicht gefunden)."
+ Write-Error "Tipp: Beim Neustart der VM wird diese Datei neu angelegt."
+ Pause
+ exit
+ }
+}
+
+$VMInfoPath = "Y:\.vminfo.json"
+
+# Schleife, die auf das Laufwerk wartet
+if (-not (Test-Path $VMInfoPath)) {
+ Write-Host "$VMInfoPath nicht gefunden. Skript beenden."
+ exit
+}
+
+# VMInfo aus JSON File einlesen
+$VMInfo = Import-VMInfo -Path $VMInfoPath
+
+& $PSScriptRoot\injector.ps1 $VMInfo.krb5.cred
diff --git a/misc/vm/vm-update-user.xml b/misc/vm/vm-update-user.xml
new file mode 100755
index 0000000..b6500e8
Binary files /dev/null and b/misc/vm/vm-update-user.xml differ
diff --git a/roles/custom/fvs/files/lmn-sync b/roles/custom/fvs/files/lmn-sync
index 16668f8..6ae5e17 100644
--- a/roles/custom/fvs/files/lmn-sync
+++ b/roles/custom/fvs/files/lmn-sync
@@ -12,7 +12,7 @@ fi
#rsync -rlptD --chown=pgmadmin:root --chmod=F755,D755 rsync://server:/local-program/ /usr/local/lmn
RSYNC_COMMAND=$(rsync -ai --delete --exclude=mimeinfo.cache \
- --chown=root:root --chmod=F644,D755 "rsync://server:/desktopstarter" \
+ --chown=root:root --chmod=F644,D755 "rsync://fileserver:/desktopstarter" \
/usr/local/share/applications/ | sed '/ \.\//d')
if [[ $? -eq 0 ]] && [[ -n "${RSYNC_COMMAND}" ]]; then
echo "${RSYNC_COMMAND}"
diff --git a/roles/custom/fvs/tasks/main.yml b/roles/custom/fvs/tasks/main.yml
index 738b4fe..3a91603 100644
--- a/roles/custom/fvs/tasks/main.yml
+++ b/roles/custom/fvs/tasks/main.yml
@@ -220,7 +220,7 @@
ansible.builtin.blockinfile:
path: /usr/share/sddm/themes/debian-breeze/Main.qml
marker: // {mark} ANSIBLE MANAGED BLOCK
- insertbefore: '\s+//Footer'
+ insertbefore: '^}$'
block: |
Text {
id: hostname
diff --git a/roles/lmn_finish/tasks/main.yaml b/roles/lmn_finish/tasks/main.yaml
index 5f3a787..2a44d0e 100644
--- a/roles/lmn_finish/tasks/main.yaml
+++ b/roles/lmn_finish/tasks/main.yaml
@@ -14,7 +14,7 @@
main non-free-firmware
state: present
update_cache: true
-# when: extra_pkgs_bpo|length
+ when: extra_pkgs_bpo | length > 0 or extra_pkgs_bpo1 | length > 0 or extra_pkgs_bpo2 | length > 0
- name: Install extra packages from backports
ansible.builtin.apt:
@@ -25,6 +25,7 @@
- "{{ extra_pkgs_bpo }}"
- "{{ extra_pkgs_bpo1 }}"
- "{{ extra_pkgs_bpo2 }}"
+ when: extra_pkgs_bpo | length > 0 or extra_pkgs_bpo1 | length > 0 or extra_pkgs_bpo2 | length > 0
- name: Timestamp successfull run and send up-to-date report
ansible.builtin.shell:
diff --git a/roles/lmn_kde/defaults/main.yml b/roles/lmn_kde/defaults/main.yml
index 779142b..07685bb 100644
--- a/roles/lmn_kde/defaults/main.yml
+++ b/roles/lmn_kde/defaults/main.yml
@@ -6,6 +6,7 @@ kde_desktop_pkg:
- calligra
- codeblocks
- dia
+ - filius
- flameshot
- freecad
- fritzing
@@ -14,8 +15,9 @@ kde_desktop_pkg:
- inkscape
- kde-full
- keepassxc
+ - kicad
+ - kicad-doc-de
- librecad
- - mu-editor
- openboard
- qtcreator
- spyder
@@ -34,3 +36,5 @@ kde_desktop_pkg:
- xdg-desktop-portal-kde
- xdg-desktop-portal-wlr # share screen in browser
- xournalpp
+
+kde_desktop_pkg_bpo: [ ]
diff --git a/roles/lmn_kde/tasks/main.yml b/roles/lmn_kde/tasks/main.yml
index 052606b..0b76358 100644
--- a/roles/lmn_kde/tasks/main.yml
+++ b/roles/lmn_kde/tasks/main.yml
@@ -8,19 +8,14 @@
repo: deb http://deb.debian.org/debian/ {{ ansible_distribution_release }}-backports main non-free-firmware
state: present
update_cache: true
+ when: kde_desktop_pkg_bpo | length > 0
- name: Install extra packages from backports
ansible.builtin.apt:
- name:
- - filius
- - kicad
- - kicad-doc-de
- - libreoffice
- - libreoffice-l10n-de
- - libreoffice-qt5
- state: latest # noqa package-latest
+ name: "{{ kde_desktop_pkg_bpo }}"
autoremove: true
default_release: "{{ ansible_distribution_release }}-backports"
+ when: kde_desktop_pkg_bpo | length > 0
- name: Create akonadi config dir
diff --git a/roles/lmn_localhome/tasks/main.yml b/roles/lmn_localhome/tasks/main.yml
index 3122720..f7c54df 100644
--- a/roles/lmn_localhome/tasks/main.yml
+++ b/roles/lmn_localhome/tasks/main.yml
@@ -9,7 +9,7 @@
ansible.builtin.blockinfile:
path: /usr/share/sddm/themes/debian-breeze/Main.qml
marker: // {mark} ANSIBLE MANAGED BLOCK localhome
- insertbefore: '\s+//Footer'
+ insertbefore: '^}$'
block: |
Text {
id: localhome
diff --git a/roles/lmn_misc/tasks/main.yml b/roles/lmn_misc/tasks/main.yml
index 22134c5..7c15ede 100644
--- a/roles/lmn_misc/tasks/main.yml
+++ b/roles/lmn_misc/tasks/main.yml
@@ -98,7 +98,7 @@
export superusers
password_pbkdf2 root {{ grub_pwd }}
notify: Run update-grub
- when: grub_pwd|default(false)
+ when: grub_pwd | bool | default(false)
- name: Allow booting grub menu entries
ansible.builtin.lineinfile:
diff --git a/roles/lmn_mount/tasks/main.yml b/roles/lmn_mount/tasks/main.yml
index 0f09299..c7f6361 100644
--- a/roles/lmn_mount/tasks/main.yml
+++ b/roles/lmn_mount/tasks/main.yml
@@ -38,12 +38,14 @@
>rootansibleDebian-gdmsddm{% if localuser %}{{ localuser }}{% endif %}
insertafter: ""
+ when: not nfs4
- name: Prepare mount point for homes
ansible.builtin.file:
path: /srv/samba/schools/default-school/
state: directory
mode: '0755'
+ when: not nfs4
- name: Prepare persistent user cache base directory
ansible.builtin.file:
@@ -104,9 +106,9 @@
- name: Mount NFSv4 home directory
ansible.posix.mount:
- src: server:/default-school
+ src: fileserver:/default-school
path: /srv/samba/schools/default-school
- opts: sec=krb5p,_netdev,x-systemd.automount,x-systemd.idle-timeout=60
+ opts: sec=krb5p,_netdev,x-systemd.automount,x-systemd.idle-timeout=30,timeo=100,soft,acl
state: present
fstype: nfs4
when: nfs4
diff --git a/roles/lmn_network/tasks/main.yml b/roles/lmn_network/tasks/main.yml
index 7a39349..571c107 100644
--- a/roles/lmn_network/tasks/main.yml
+++ b/roles/lmn_network/tasks/main.yml
@@ -5,14 +5,14 @@
mode: '0644'
content: >
{{ apt_conf }}
- when: apt_conf|default(false)
+ when: apt_conf | bool | default(false)
- name: Set NTP server
ansible.builtin.lineinfile:
path: /etc/systemd/timesyncd.conf
insertafter: '^#NTP='
line: NTP={{ ntp_serv }}
- when: ntp_serv|default(false)
+ when: ntp_serv | bool | default(false)
- name: Add proposed-updates repository
ansible.builtin.apt_repository:
diff --git a/roles/lmn_printer/tasks/main.yml b/roles/lmn_printer/tasks/main.yml
index 960b1fa..996cb2e 100644
--- a/roles/lmn_printer/tasks/main.yml
+++ b/roles/lmn_printer/tasks/main.yml
@@ -37,7 +37,7 @@
line: "SystemGroup root lpadmin {{ printer_admin_group }}"
regexp: '^SystemGroup'
state: present
- when: printer_admin_group | length
+ when: printer_admin_group | length > 0
- name: Disable cups-browsed
ansible.builtin.systemd:
diff --git a/roles/lmn_sssd/templates/sssd.conf.j2 b/roles/lmn_sssd/templates/sssd.conf.j2
index fc3bf48..fef5d02 100644
--- a/roles/lmn_sssd/templates/sssd.conf.j2
+++ b/roles/lmn_sssd/templates/sssd.conf.j2
@@ -17,6 +17,7 @@ ad_gpo_access_control = disabled
ad_gpo_ignore_unreadable = True
ad_maximum_machine_account_password_age = 0
ignore_group_members = True
+krb5_renew_interval = 1h
{% if localhome is defined and localhome %}
override_homedir = /home/%u
{% endif %}
diff --git a/roles/lmn_vm/files/vm-link-images b/roles/lmn_vm/files/vm-link-images
index e4c8618..0eccd04 100755
--- a/roles/lmn_vm/files/vm-link-images
+++ b/roles/lmn_vm/files/vm-link-images
@@ -19,8 +19,9 @@ done
shift "$((OPTIND -1))"
# link system-VM-Images to User VM Directory
-for i in *.qcow2; do
- [[ -f "${VM_DIR}/${i}" ]] || ln "${i}" "${VM_DIR}/${i}"
+for filename in "$@"; do
+ filename="$(basename ${filename})"
+ [[ -f "${VM_DIR}/${filename}" ]] || ln "${filename}" "${VM_DIR}/${filename}"
done
# allow lmnsynci to remove old vm images
diff --git a/roles/lmn_vm/files/vm-run b/roles/lmn_vm/files/vm-run
index a957a49..c76fed2 100755
--- a/roles/lmn_vm/files/vm-run
+++ b/roles/lmn_vm/files/vm-run
@@ -90,17 +90,21 @@ create_clone() {
local VM_NAME="$1"
if ! [[ -f "${VM_SYSDIR}/${VM_NAME}.qcow2" || -f "${VM_DIR}/${VM_NAME}.qcow2" ]]; then
- echo "qcow2 File does not exists." >&2
- exit 1
+ echo "qcow2 File does not exists." >&2
+ exit 1
fi
# Create User-VM-Dir and link system VM-Images
[[ -d "${VM_DIR}" ]] || mkdir -p "${VM_DIR}"
- if [[ "${PERSISTENT}" -eq 1 ]]; then
- sudo /usr/local/bin/vm-link-images -p
- else
- sudo /usr/local/bin/vm-link-images
- fi
+ IMAGE="${VM_NAME}.qcow2"
+ while [[ -n ${IMAGE} ]]; do
+ if [[ "${PERSISTENT}" -eq 1 ]]; then
+ sudo /usr/local/bin/vm-link-images -p "${IMAGE}"
+ else
+ sudo /usr/local/bin/vm-link-images "${IMAGE}"
+ fi
+ IMAGE="$(qemu-img info -U "${VM_DIR}/${IMAGE}" | grep "^backing file:" | cut -d ' ' -f 3)"
+ done
# Create backing file
cd "${VM_DIR}"
@@ -130,18 +134,30 @@ create_printerlist() {
}
create_mountlist() {
- if id | grep -q teachers; then
- NETHOME=/srv/samba/schools/default-school/teachers/$USER
- else
- NETHOME=(/srv/samba/schools/default-school/students/*/"$USER")
- fi
- NETHOME="${NETHOME#/srv/samba/schools}"
- cat << EOF > "/lmn/media/${USER}/.mounts.csv"
+ NETHOMEPART="${NETHOME#/srv/samba/schools}"
+ cat << EOF > "${VMINFO_DIR}/.mounts.csv"
Drive;Remotepath
-H;\\\\10.190.1.1${NETHOME//\//\\}
-T;\\\\10.190.1.1\default-school\share
+H;\\\\server.pn.steinbeis.schule${NETHOMEPART//\//\\}
+T;\\\\server.pn.steinbeis.schule\\default-school\\share
EOF
- echo "${USER}" > "/lmn/media/${USER}/.user"
+ echo "${USER}" > "/${VMINFO_DIR}/.user"
+}
+
+start_virtiofs_service() {
+ local target_name=$1
+ local shared_dir=$2
+ local drive_letter=$3
+ local socket="/run/user/${UID}/virtiofs-${VM_NAME}-${target_name,,}.sock"
+
+ systemd-run --user /usr/local/bin/virtiofsd --uid-map=":${GUEST_UID}:${UID}:1:" --gid-map=":${GUEST_GID}:$(id -g):1:" \
+ --socket-path "${socket}" --shared-dir "${shared_dir}" --syslog
+
+ if [[ $? -ne 0 ]]; then
+ echo "Error starting virtiofsd for ${target_name}." >&2
+ return 1
+ fi
+
+ LIBVIRTOPTS="${LIBVIRTOPTS} --filesystem driver.type=virtiofs,accessmode=passthrough,target.dir=${target_name},xpath1.set=./source/@socket=${socket}"
}
start_virtiofsd() {
@@ -151,9 +167,17 @@ start_virtiofsd() {
[[ "$GUEST_GID" == 0 ]] && GUEST_GID=1010
fi
# END temporary fix
- socket="/run/user/$(id -u $USER)/virtiofs-${VM_NAME}.sock"
- systemd-run --user /usr/local/bin/virtiofsd --uid-map=:${GUEST_UID}:${UID}:1: --gid-map=:${GUEST_GID}:$(id -g):1: \
- --socket-path "$socket" --shared-dir "/lmn/media/${USER}" --syslog
+
+ # start_virtiofs_service "VM-Data" "/lmn/media/${USER}" "Y"
+ # start_virtiofs_service "default-school" "/srv/samba/schools/default-school" "Y"
+
+ # Home@PC / VM-Data
+ # if the environment variable VMLEGACY is set, /lmn/media/USER is forced
+ if [[ "${HOME}" != "${NETHOME}" && ! -v VMLEGACY ]]; then
+ start_virtiofs_service "Home_Linux" "${HOME}" "Y"
+ else
+ start_virtiofs_service "VM-Data" "/lmn/media/${USER}" "Y"
+ fi
}
ask_really_persistent() {
@@ -216,7 +240,7 @@ while true; do
shift
;;
-o | --options )
- LIBVIRTOPTS=$2
+ LIBVIRTOPTS="${LIBVIRTOPTS} $2"
shift 2
;;
--no-viewer )
@@ -267,6 +291,7 @@ while true; do
type="ethernet,mac=${mac},target.dev=${interface},xpath1.set=./target/@managed=no,model.type=virtio"
LIBVIRTOPTS="${LIBVIRTOPTS} --network type=$type"
done
+ LIBVIRTOPTS="${LIBVIRTOPTS} --check mac_in_use=off"
shift
;;
--os )
@@ -315,18 +340,33 @@ if ! virsh --connect="${QEMU}" list | grep "${VM_NAME}-clone"; then
check_images
fi
if [[ "${NEWCLONE}" = 1 ]] || [[ ! -f "${VM_DIR}/${VM_NAME}-clone.qcow2" ]]; then
- create_clone "${VM_NAME}"
+ create_clone "${VM_NAME}"
fi
# delete the old vm
virsh --connect=qemu:///session undefine --nvram "${VM_NAME}-clone" || echo "${VM_NAME}-clone did not exist"
#trap exit_script SIGHUP SIGINT SIGTERM
+ if id | grep -q teachers; then
+ NETHOME=/srv/samba/schools/default-school/teachers/$USER
+ else
+ NETHOME=(/srv/samba/schools/default-school/students/*/"$USER")
+ fi
+ if [[ "${HOME}" != "${NETHOME}" ]]; then
+ VMINFO_DIR="${HOME}"
+ else
+ VMINFO_DIR="/lmn/media/${USER}"
+ fi
create_printerlist
create_mountlist
# start virtiofsd-service
[[ "${QEMU}" = 'qemu:///session' ]] && start_virtiofsd
+ # Create VMInfo Json file
+ #( umask 027; ./vm-create-vminfo > "${VMINFO_DIR}/.vminfo.json" )
+ # Start vminfo.timer
+ systemctl --user start vminfo.timer
+
uuid=$(openssl rand -hex 16)
uuid="${uuid:0:8}-${uuid:8:4}-${uuid:12:4}-${uuid:16:4}-${uuid:20:12}"
@@ -348,7 +388,6 @@ if ! virsh --connect="${QEMU}" list | grep "${VM_NAME}-clone"; then
--memorybacking source.type=memfd,access.mode=shared \
--disk "${VM_DIR}/${VM_NAME}-clone.qcow2",driver.discard=unmap,target.bus=scsi,cache=writeback \
--network=bridge=virbr0,model.type=virtio \
- --filesystem driver.type=virtiofs,accessmode=passthrough,target.dir=virtiofs,xpath1.set=./source/@socket="/run/user/${UID}/virtiofs-${VM_NAME}.sock" \
--controller type=scsi,model=virtio-scsi \
--check path_in_use=off \
--connect="${QEMU}" \
diff --git a/roles/lmn_vm/files/vm-vminfo b/roles/lmn_vm/files/vm-vminfo
new file mode 100755
index 0000000..f19b4ce
--- /dev/null
+++ b/roles/lmn_vm/files/vm-vminfo
@@ -0,0 +1,113 @@
+#!/usr/bin/python3
+
+import argparse
+import struct
+import subprocess
+import json
+
+from os import environ,path
+from impacket.krb5.ccache import CCache
+from base64 import b64encode
+
+home = ""
+nethome = ""
+vminfo = {}
+
+def get_printers():
+ printers = []
+ try:
+ result = subprocess.run(['lpstat', '-v'], capture_output=True, text=True, check=True)
+ for line in result.stdout.splitlines():
+ # Extrahiere den Druckernamen
+ printer_name = line.split()[2].rstrip(':')
+ ipp_url = f"ipp://192.168.122.1/printers/{printer_name}"
+ printer = { 'Name': printer_name, 'IppURL': ipp_url }
+ printers.append(printer)
+ return printers
+ except subprocess.CalledProcessError as e:
+ print(f"Fehler beim Abrufen der Drucker: {e}")
+ return []
+
+def get_groups(username):
+ try:
+ result = subprocess.run(['id', '-Gnz', username], capture_output=True, text=True, check=True)
+ groups = result.stdout.strip().split('\0')
+ return groups
+ except subprocess.CalledProcessError as e:
+ print(f"Fehler beim Abrufen der Gruppen: {e}")
+ return []
+
+def get_krb5 ():
+ krb5 = {}
+ ccachefilename = environ.get('KRB5CCNAME').replace('FILE:', '')
+ if ccachefilename:
+ try:
+ ccache = CCache.loadFile(ccachefilename)
+ cred = ccache.toKRBCRED()
+ cred_enc = b64encode(cred)
+ krb5['cred'] = cred_enc.decode('utf-8')
+ krb5['starttime'] = ccache.credentials[0]['time']['starttime']
+ krb5['endtime'] = ccache.credentials[0]['time']['endtime']
+ krb5['renew_till'] = ccache.credentials[0]['time']['renew_till']
+ except:
+ print("Fehler beim Ticket laden")
+ return krb5
+
+def get_mounts():
+ mounts = []
+ mounts.append({ 'Drive': 'H', 'RemotePath': '\\\\server.pn.steinbeis.schule' + nethome.replace('/srv/samba/schools','').replace('/','\\'), 'Name': 'Home_Server' })
+ mounts.append({ 'Drive': 'T', 'RemotePath': '\\\\server.pn.steinbeis.schule\default-school\share', 'Name': 'Tausch' })
+ return mounts
+
+def get_user_folders():
+ HOME="H:"
+ if environ.get('HOME') != nethome:
+ HOME="Y:"
+ folders = []
+ folders.append( {'Name': 'Personal', 'Path': f"{HOME}\Dokumente"} )
+ folders.append( {'Name': 'My Pictures', 'Path': f"{HOME}\Bilder"} )
+ folders.append( {'Name': 'My Music', 'Path': f"{HOME}\Musik"} )
+ folders.append( {'Name': 'My Video', 'Path': f"{HOME}\Videos"} )
+ return folders
+
+def get_quickaccess():
+ quickaccess = []
+ quickaccess.append( 'H:\\transfer' )
+ return quickaccess
+
+def parse_args():
+ parser = argparse.ArgumentParser()
+ #parser.add_argument('input_file', help="File in kirbi (KRB-CRED) or ccache format")
+ #parser.add_argument('output_file', help="Output file")
+ return parser.parse_args()
+
+
+def main():
+ global home, nethome
+
+ args = parse_args()
+
+ home = environ.get('HOME')
+
+ vminfo['User'] = environ.get('USER')
+ vminfo['Groups'] = get_groups(environ.get('USER'))
+
+ if 'teachers' in vminfo['Groups']:
+ nethome = f"/srv/samba/schools/default-school/teachers/{vminfo['User']}"
+ else:
+ result = subprocess.run(['find', '/srv/samba/schools/default-school/students/', '-name', vminfo['User'], '-maxdepth', '2', '-type', 'd'], capture_output=True, text=True, check=False)
+ nethome = result.stdout
+
+ vminfo['Printers'] = get_printers()
+ vminfo['krb5'] = get_krb5()
+ vminfo['Mounts'] = get_mounts()
+ vminfo['UserShellFolders'] = get_user_folders()
+ vminfo['QuickAccess'] = get_quickaccess()
+
+ vminfo_json = json.dumps(vminfo, ensure_ascii=False, indent=4)
+ print(vminfo_json)
+
+if __name__ == '__main__':
+ main()
+
+
diff --git a/roles/lmn_vm/tasks/main.yml b/roles/lmn_vm/tasks/main.yml
index a39325a..fd5bace 100644
--- a/roles/lmn_vm/tasks/main.yml
+++ b/roles/lmn_vm/tasks/main.yml
@@ -18,7 +18,9 @@
- mktorrent
- libvirt-daemon-system
- virt-manager
+ - virt-viewer
- dialog # for vm-netboot menu
+ - python3-impacket
# - name: allow all users to use VMs
# lineinfile:
@@ -27,46 +29,20 @@
# insertafter: '#auth_unix_rw = "polkit"'
# notify: reload libvirtd
-- name: Configure pam_mount for VM bind mounts
- ansible.builtin.blockinfile:
- dest: /etc/security/pam_mount.conf.xml
- marker: ""
- block: |
-
- rootansibleDebian-gdmsddm{% if localuser %}{{ localuser }}{% endif %}
-
- rootansibleDebian-gdmsddm{% if localuser %}{{ localuser }}{% endif %}
-
- rootansibleDebian-gdmsddm{% if localuser %}{{ localuser }}{% endif %}
-
- insertafter: ""
+ # - name: Use umount script for proper cleanup
+ # ansible.builtin.blockinfile:
+ # dest: /etc/security/pam_mount.conf.xml
+ # marker: ""
+ # block: |
+ #
+ # /usr/local/sbin/pam-umount.sh %(USER) %(USERUID) %(MNTPT)
+ # insertafter: '^"
- block: |
-
- /usr/local/sbin/pam-umount.sh %(USER) %(USERUID) %(MNTPT)
- insertafter: '^ "{% if localhome %}~{% else %}/lmn/media/${USER}{% endif %}/.vminfo.json"'
+ dest: /etc/systemd/user/vminfo.service
+ mode: '0644'
+
+- name: Provide vminfo timer
+ ansible.builtin.copy:
+ content: |
+ [Unit]
+ Description=Timer for vm-info
+ [Timer]
+ OnActiveSec=0s
+ OnUnitActiveSec=1h
+ Persistent=true
+ dest: /etc/systemd/user/vminfo.timer
+ mode: '0644'
diff --git a/roles/lmn_vpn/tasks/main.yml b/roles/lmn_vpn/tasks/main.yml
index b6da7e0..f8bbf1a 100644
--- a/roles/lmn_vpn/tasks/main.yml
+++ b/roles/lmn_vpn/tasks/main.yml
@@ -6,9 +6,9 @@
mode: "0755"
- name: Copy NetworkManager dispatcher-script (10-lmn-mount.sh)
- ansible.builtin.copy:
- src: 10-lmn-mount.sh
- dest: /etc/NetworkManager/dispatcher.d/
+ ansible.builtin.template:
+ src: 10-lmn-mount.sh.j2
+ dest: /etc/NetworkManager/dispatcher.d/10-lmn-mount.sh
mode: "0755"
- name: Create link to dispatcher-script (10-lmn-mount.sh)
diff --git a/roles/lmn_vpn/files/10-lmn-mount.sh b/roles/lmn_vpn/templates/10-lmn-mount.sh.j2
similarity index 75%
rename from roles/lmn_vpn/files/10-lmn-mount.sh
rename to roles/lmn_vpn/templates/10-lmn-mount.sh.j2
index 6f42725..a2aec0d 100755
--- a/roles/lmn_vpn/files/10-lmn-mount.sh
+++ b/roles/lmn_vpn/templates/10-lmn-mount.sh.j2
@@ -4,15 +4,24 @@ set -eu
if [[ "$CONNECTION_ID" = "VPN-Schule" ]]; then
USERNAME=$(ps -o pid,user,args -C sddm-helper | sed -nE 's/.*user (.*)$/\1/p')
- USERID=$(id -u "${USERNAME}")
- GROUPID=$(id -g "${USERNAME}")
- KRB5CCNAME=$(ls /tmp/krb5cc_"${USERID}"_*)
- export KRB5CCNAME
- printenv >&2
if [[ "$NM_DISPATCHER_ACTION" = "up" ]]; then
# Exit if server is already mounted
findmnt /srv/samba/schools/default-school > /dev/null && exit 0
+ {% if nfs4 %}
+ echo "Before systemctl restart autofs" >&2
+ systemctl restart srv-samba-schools-default\\x2dschool.automount
+ echo "After systemctl restart autofs" >&2
+ {% else %}
+ USERID=$(id -u "${USERNAME}")
+ GROUPID=$(id -g "${USERNAME}")
+ KRB5CCNAME=$(ls /tmp/krb5cc_"${USERID}"_*)
+ export KRB5CCNAME
+ printenv >&2
+
+ # Exit if server is already mounted
+ findmnt /srv/samba/schools/default-school > /dev/null && exit 0
+
if ! klist -s -c "${KRB5CCNAME}"; then
#echo "try to renew KRB5-Ticket" >&2
#sudo -u "${USERNAME}" kinit -R -c "${KRB5CCNAME}"
@@ -30,7 +39,9 @@ if [[ "$CONNECTION_ID" = "VPN-Schule" ]]; then
-o "sec=krb5i,cruid=${USERID},user=${USERNAME},uid=${USERID},gid=${GROUPID},file_mode=0700,dir_mode=0700,mfsymlinks,nobrl,actimeo=600,cache=loose,echo_interval=10"
echo "after mount" >&2
mount --bind /srv/samba/schools/default-school/share "/lmn/media/${USERNAME}/share"
+ {% endif %}
SUDO_USER=$USERNAME /usr/local/bin/install-printers.sh
+ {% if not nfs4 %}
elif [[ "$NM_DISPATCHER_ACTION" = "pre-down" ]]; then
# FIXME: Only umount server when Wireguard-Connection was the only connection to server.
# Dirty fix (works only in fvs-IP-Range)
@@ -39,5 +50,6 @@ if [[ "$CONNECTION_ID" = "VPN-Schule" ]]; then
umount "/lmn/media/${USERNAME}/share"
umount /srv/samba/schools/default-school
fi
+ {% endif %}
fi
fi