public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-4635] middle-end: Allow _BitInt(65535) [PR102989]
@ 2023-10-14  7:38 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2023-10-14  7:38 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:cb0119242317c2a6f3127b4acff6aadbfd1dfbc4

commit r14-4635-gcb0119242317c2a6f3127b4acff6aadbfd1dfbc4
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Sat Oct 14 09:35:44 2023 +0200

    middle-end: Allow _BitInt(65535) [PR102989]
    
    The following patch lifts further restrictions which limited _BitInt to at
    most 16319 bits up to 65535.
    The problem was mainly in INTEGER_CST representation, which had 3
    unsigned char members to describe lengths in number of 64-bit limbs, which
    it wanted to fit into 32 bits.  This patch removes the third one which was
    just a cache to save a few compile time cycles for wi::to_offset and
    enlarges the other two members to unsigned short.
    Furthermore, the same problem has been in some uses of trailing_wide_int*
    (in value-range-storage*) and value-range-storage* itself, while other
    uses of trailing_wide_int* have been fine (e.g. CONST_POLY_INT, where no
    constants will be larger than 3/5/9/11 limbs depending on target, so 255
    limit is plenty).  The patch turns all those length representations to be
    unsigned short for consistency, so value-range-storage* can handle even
    16320-65535 bits BITINT_TYPE ranges.  The cc1plus growth is about 16K,
    so not really significant for 38M .text section.
    
    Note, the reason for the new limit is
      unsigned int precision : 16;
    TYPE_PRECISION limit, if we wanted to overcome that, TYPE_PRECISION would
    need to use some other member for BITINT_TYPE from all the others and
    we could reach that way 4194239 limit (65535 * 64 - 1, again implied by
    INTEGER_CST and value-range-storage*).  Dunno if that is
    worth it or if it is something we want to do for GCC 14 though.
    
    2023-10-14  Jakub Jelinek  <jakub@redhat.com>
    
            PR c/102989
    gcc/
            * tree-core.h (struct tree_base): Remove int_length.offset
            member, change type of int_length.unextended and int_length.extended
            from unsigned char to unsigned short.
            * tree.h (TREE_INT_CST_OFFSET_NUNITS): Remove.
            (wi::extended_tree <N>::get_len): Don't use TREE_INT_CST_OFFSET_NUNITS,
            instead compute it at runtime from TREE_INT_CST_EXT_NUNITS and
            TREE_INT_CST_NUNITS.
            * tree.cc (wide_int_to_tree_1): Don't assert
            TREE_INT_CST_OFFSET_NUNITS value.
            (make_int_cst): Don't initialize TREE_INT_CST_OFFSET_NUNITS.
            * wide-int.h (WIDE_INT_MAX_ELTS): Change from 255 to 1024.
            (WIDEST_INT_MAX_ELTS): Change from 510 to 2048, adjust comment.
            (trailing_wide_int_storage): Change m_len type from unsigned char *
            to unsigned short *.
            (trailing_wide_int_storage::trailing_wide_int_storage): Change second
            argument from unsigned char * to unsigned short *.
            (trailing_wide_ints): Change m_max_len type from unsigned char to
            unsigned short.  Change m_len element type from
            struct{unsigned char len;} to unsigned short.
            (trailing_wide_ints <N>::operator []): Remove .len from m_len
            accesses.
            * value-range-storage.h (irange_storage::lengths_address): Change
            return type from const unsigned char * to const unsigned short *.
            (irange_storage::write_lengths_address): Change return type from
            unsigned char * to unsigned short *.
            * value-range-storage.cc (irange_storage::write_lengths_address):
            Likewise.
            (irange_storage::lengths_address): Change return type from
            const unsigned char * to const unsigned short *.
            (write_wide_int): Change len argument type from unsigned char *&
            to unsigned short *&.
            (irange_storage::set_irange): Change len variable type from
            unsigned char * to unsigned short *.
            (read_wide_int): Change len argument type from unsigned char to
            unsigned short.  Use trailing_wide_int_storage <unsigned short>
            instead of trailing_wide_int_storage and
            trailing_wide_int <unsigned short> instead of trailing_wide_int.
            (irange_storage::get_irange): Change len variable type from
            unsigned char * to unsigned short *.
            (irange_storage::size): Multiply n by sizeof (unsigned short)
            in len_size variable initialization.
            (irange_storage::dump): Change len variable type from
            unsigned char * to unsigned short *.
    gcc/cp/
            * module.cc (trees_out::start, trees_in::start): Remove
            TREE_INT_CST_OFFSET_NUNITS handling.
    gcc/testsuite/
            * gcc.dg/bitint-38.c: Change into dg-do run test, in addition
            to checking the addition, division and right shift results at compile
            time check it also at runtime.
            * gcc.dg/bitint-39.c: New test.

Diff:
---
 gcc/cp/module.cc                 |  2 --
 gcc/testsuite/gcc.dg/bitint-38.c | 51 ++++++++++++++++++++++++++++++----------
 gcc/testsuite/gcc.dg/bitint-39.c | 43 +++++++++++++++++++++++++++++++++
 gcc/tree-core.h                  | 10 ++------
 gcc/tree.cc                      |  9 -------
 gcc/tree.h                       | 12 +++++++---
 gcc/value-range-storage.cc       | 20 ++++++++--------
 gcc/value-range-storage.h        |  6 ++---
 gcc/wide-int.h                   | 25 +++++++++-----------
 9 files changed, 116 insertions(+), 62 deletions(-)

diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index e3fb2299d93..bbb1e20b55b 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -5158,7 +5158,6 @@ trees_out::start (tree t, bool code_streamed)
     case INTEGER_CST:
       u (TREE_INT_CST_NUNITS (t));
       u (TREE_INT_CST_EXT_NUNITS (t));
-      u (TREE_INT_CST_OFFSET_NUNITS (t));
       break;
 
     case OMP_CLAUSE:
@@ -5231,7 +5230,6 @@ trees_in::start (unsigned code)
 	unsigned n = u ();
 	unsigned e = u ();
 	t = make_int_cst (n, e);
-	TREE_INT_CST_OFFSET_NUNITS(t) = u ();
       }
       break;
 
diff --git a/gcc/testsuite/gcc.dg/bitint-38.c b/gcc/testsuite/gcc.dg/bitint-38.c
index 95673dce3c8..1dc7a56112e 100644
--- a/gcc/testsuite/gcc.dg/bitint-38.c
+++ b/gcc/testsuite/gcc.dg/bitint-38.c
@@ -1,18 +1,43 @@
 /* PR c/102989 */
-/* { dg-do compile { target { bitint } } } */
+/* { dg-do run { target { bitint } } } */
 /* { dg-options "-std=c2x" } */
 
 #if __BITINT_MAXWIDTH__ >= 16319
-constexpr unsigned _BitInt(16319) a
-  = 468098567701677261276215481936770442254383643766995378241600227179396283432916865881332215867106489159251577495372085663487092317743244770597287633199005374998455333587280357490149993101811392051483761495987108264964738337118155155862715438910721661230332533185335581757600511846854115932637261969633134365868695363914570578110064471868475841348589366933645410987699979080140212849909081188170910464967486231358935212897096260626033055536141835599284498474737858487658470115144771923114826312283863035503700600141440724426364699636330240414271275626021294939422483250619629005959992243418661230122132667769781183790338759345884903821695590991577228520523725302048215447841573113840811593638413425054938213262961448317898574140533090004992732688525115004782973893244091427000396890427152225308661078954671066069234453757593181753900865203439035402480306413572239610467142591920809187367438071170100969567440044691427487959785637338381651309916782063670286046547585240837892307170928849485877186793280707600840866783471799148179250818387716183127323346199533387463363442356218803779697005759324410376476855222420876262425985571982818180353870410149824214544313013285199544193496624223219986402944849622489422007678564946174797892795089330899535624727777525330789492703574564112252955147770942929761545604350869404246558274752353510370157229485004402131043153454290397929387276374054938578976878606467217359398684275050519104413914286024106808116340712273059427362293703151355498336213170698894448405369398757188523160460292714875857879968173578328191358215972493513271297875634400793301929250052822258636015650857683023900709845410838487936778533250407886180954576046340697908584020951295048844938047865657029072850797442976146895294184993736999505485665742811313795405530674199848055802759901786376822069529342971261963119332476504064285869362049662083405789828433132154933242817432809415810548180658750393692272729586232842065658490971201927780014258815333115459695117942273551876646844821076723664040282772834511419891351278169017103987094803829594286352340468346618726088781492626816188657331359104171819822673805856317828499039088088223137258297373929043307673570090396947789598799922928643843532617012164811074618881774622628943539037974883812689130801860915090035870244061005819418130068390986470314677853605080103313411837904358287837401546257413240466939893527508931541065241929872307203876443882106193262544652290132364691671910332006127864146991404015366683569317248057949596070354929361158326955551600236075268435044105880162798380799161607987365282458662031599096921825176202707890730023698706855762932691688259365358964076595824577775275991183149118372047206055118463112864604063853894820407249837871368934941438119680605528546887256934334246075596746410297954458632358171428714141820918183384435681332379317541048252391710712196623406338702061195213724569303285402242853671386113148211535691685461836458295037538034378318055108240082414441205300401526732399959228346926528586852743389490978734787926721999855388794711837164423007719626109179005466113706450765269687580819822772189301084503627297389675134228222337286867641110511061980231247884533492442898936743429641958314135329073406495776369208158032115883850691010569048983941126771477990976092252391972812691669847446798507244106121667885423025613769258102773855537509733295805013313937402282804897213847221072647111605172349464564089914906493508133855389627177663426057763252086286325343811254757681803068276278048757997425284334713190226818463023074461900176958010055572434983135171145365242339273326984465181064287264645470832091115100640584104375577304056951969456200138485313560009272338228103637763863289261673258726736753407044143664079479496972580560534494806170810469304773005873590626280072387999668522546747985701599613975101188543857852141559251634058676718308000324869809628199442681565615662912626022796064414496106344236431285697688357707992989966561557171729972093533007476947862215922583204811189015550505642082475400647639520782187776825395598257421714106473869797642678266380755873356747812273977691604147842741151722919464734890326772594979022403228191075586910464204870254674290437668861177639713112762996390246102030994917186957826982084194156870398312336059100521566034092740694642613192909850644003933745129291062576341213874815510099835708723355432970090139671120232910747665906191360160259512198160849784197597300106223945960886603127136037120000864968668651452411048372895607382907494278810971475663944948791458618662250238375166523484847507342040066801856222328988662049579299600545682490412754483621051190231623196265549391964259780178070495642538883789503379406531279338866955157646654913405181879254189185904298325865503395688786311067669273609670603076582607253527084977744533187145642686236350165593980428575119329911921382240780504527422630654086941060242757131313184709635181001199631726283364158943337968797uwb
-    + 9935443518057456429927126655222257817207511311671335832560065573055276678747990652907348839741818562757939084649073348172108397183827020377941725983107513636287406530526358253508437290241937276908386282904353079102904535675608604576486162998319427702851278408213641454837223079616401615875672453250148421679223829417834227518133091055180270249266161676677176149675164257640812344297935650729629801878758059944090168862730519817203352341458310363811482318083270232434329317323822818991134500601669868922396013512969477839456472345812312321924215241849772147687455760224559240952737319009348540894966363568158349501355229264646770018071590502441702787269097973979899837683122194103110089728425676690246091146993955037918425772840022288222832932542516091501149477160856564464376910293230091963573119230648026667896399352790982611957569978972038178519570278447540707502861678502657905192743225893225663994807568918644898273702285483676385717651104042002105352993176512166420085064452431753181365805833548922676748890412420332694609096819779765600345216390394307257556778223743443958983962113723193551247897995423762348092103893683711373897139168289420267660611409947644548715007787832959251167553175096639147674776117973100447903243626902892382263767591328038235708593401563793019418124453166386471792468421003855894206584354731489363668134077946203546067237235657746480296831651791790385981397558458905904641394246279782746736009101862366868068363411976388557697921914317179371206444085390779634831369723370050764678852846779369497232374780691905280992368079762747352245519607264154197148958896955661904214909184952289996142050604821608749900417845137727596903100452350067551305840998280482775209883278873071895588751811462342517825753493814997918418437455474992422243919549967371964423457440287296270855605850954685912644303354019058716916735522533065323057755479803668782530250381988211075034655760123250249441440684338450953823290346909689822527652698723502872312570305261196768477498898020793071808758903381796873868682378850925211629392760628685222745073544116615635557910805357623590218023715832716372532519372862093828545797325567803691998051785156065861566888871461130133522039321843439017964382030080752476709398731341173062430275003111954907627837208488348686666904765710656917706470924318432160155450726007668035494571779793129212242101293274853237850848806152774463689243426683295884648680790240363097015218347966399166380090370628591288712305133171869639679922854066493076773166970190482988828017031016891561971986279675371963020932469337264061317786330566839383989384760935590299287963546863848119999451739548405124001514033096695605580766121611440638549988895970262425133218159848061727217163487131806481686766843789971465247903534853837951413845786667122427182648989156599529647439419553785158561613114023267303869927565170507781782366447011340851258178534101585950081423437703778492347448230473897643505773957385504112182446690585033823747175966929091293693201061858670141209129091452861292276276012910624071241165402089161606944423826245461608594935732481900198240862293409442308800690019550831630479883000579884614601906961723011354449804576794339826056986957680090916046848673419723529694384653809400377218545075269148766129194637039408225515678013332188074997217667835494940043014917877438354902673107453164275280010251040360040937308738925689475725131639032011979009642713542292894219059352972933151112376197383814925363288670995556269447804994925086791728136906693249507115097807060365872110998210768336078389508724184863597285987736912073071980137162590779664675033429119327855307827174673749257462983054221631797527009987595732460222197367608440973488211898471439302051388806818521659685873672383828021329848153410204926607710971678268541677584421695238011784351386047869158787156634630693872428067864980320063293435887574745859067024988485742353278548704467544298793511583587659713711677065792371199329419372392720321981862269890024832348999865449339856339220386853162641984444934998176248821703154774794026863423846665361147912580310179333239849314145158103813724371277156031826070213656189218428551171492579367736652650240510840524479280661922149370381404863668038229922105064658335083314946842545978050497021795217124947959575065471749872278802756371390871441004232633252611825748658593540667831098874027223327541523742857750954119615708541514145110863925049204517574000824797900817585376961462754521495100198829675100958066639531958106704159717265035205597161047879510849900587565746603225763129877434317949842105742386965886137117798642168190733367414126797929434627532307855448841035433795229031275545885872876848846666666475465866905332293095381494096702328649920740506658930503053162777944821433383407283155178707970906458023827141681140372968356084617001053870499079884384019820875585843129082894687740533946763756846924952825251383026364635539377880784234770789463152435704464616uwb;
-constexpr unsigned _BitInt(16319) b
-  = 20129744567093027275741005070628998262449166046517026903695683755854448756834360166513132405078796314602781998330705368407367482030156637206994877425582250124595106718397028199112773892105727478029626122540718672466812244172521968825004812596684190534400169291245019886664334632347203172906471830047918779870667296830826108769036384267604969509336398421516482677170697323144807237345130767733861415665037591249948490085867356183319101541167176586195051721766552194667530417142250556133895688441663400613014781276825394358975458967475147806589013506569415945496841131100738180426238464950629268379774013285627049621529192047736803089092751891513992605419086502588233332057296638567290306093910878742093500873864277174719410183640765821580587831967716708363976225535905317908137780497267444416760176647705834046996010820212494244083222254037700699529789991033448979912128507710343500466786839351071045788239200231971288879352062329627654083430317549832483148696514166354870702716570783257707960927427529476249626444239951812293100465038963807939297639901456086408459677292249078230581624034160083198437374539728677906306289960873601083706201882999243554025429957091619812945018432503309674349427513057767160754691227365332241845175797106713295593063635202655344273695438810685712451003351469460085582752740414723264094665962205140763820691773090780866423727990711323748512766522537850976590598658397979845215595029782750537140603588592215363608992433922289542233458102634259275757690440754308009593855238137227351798446486981151672766513716998027602215751256719370429397129549459120277202327118788743080998483470436192625398340057850391478909668185290635380423955404607217710958636050373730838469336370845039431945543326700579270919052885975364141422331087288874462285858637176621255141698264412903522678033317989170115880081516284097559300133507799471895326457336815172421155995525168781635131143991136416642016744949082321204689839861376266795485532171923826942486502913400286963940309484507484129423576156798044985198780159055788525538310878089397895175129162099671894337526801235280427428321205321530735108239848594278720839317921782831352363541199919557577597546876704462612904924694431903072332864341465745291866718067601041404212430941956177407763481845568339170224196193106463030409080073136605433869775860974939991008596874978506245689726966715206639438259724689301019692258116991317695012205036157177039536905494005833948384397446492918129185274359806145454148241131925838562069991934872329314452016900728948186477387223161994145551216156032211038319475270853818660079065895119923373317496777184177315345923787700803986965175033224375435249224949151191006574511519055220741174631165879299688118138728380219550143006894817522270338472413899079751917314505754802052988622174392135207139715960212346858882422543222621408433817817181595201086403368301839080592455115463829425708132345811270911456928961301265223101989524481521721969838980208647528038509328501705428950749820080720418776718084142086501267418284241370398868561282277848391673847937247873117719906103441015578245152673184719538896073697272475250261227685660058944107087333786104761624391816175414338999215260190162551489343436332492645887029551964578826432156700872459216605843463884228343167159924792752429816064841479438134662749621639560203443871326810129872763539114284811330805213188716333471069710270583945841626338361700846410927750916663908367683188084193258384935122236639934335284160522042065088923421928660724095726039642836343542211473282392554371973074108770797447448654428325845253304889062021031599531436606775029315849674756213988932349651640552571880780461452187094400408403309806507698230071584809861634596000425300485805174853406774961321055086995665513868382285048348264250174388793184093524675621762558537763747237314473883173686633576273836946507237880619627632543093619281096675643877749217588495383292078713230253993525326209732859301842016440189010027733234997657748351253359664018894197346327201303258090754079801393874104215986193719394144148559622409051961205332355846077533183278890738832391535561074612724819789952480872328880408266970201766239451001690274739141595541572957753788951050043026811943691163688663710637928472363177936029259448725818579129920714382357882142208643606823754520733994646572586821541644398149238544337745998203264678454665487925173493921777764033537269522992103115842823750405588538846833724101543165897489915300004787110814394934465518176677482202804123781727309993329004830726928892557850582806559007396866888620985629055058474721708813614135721948922060211334334572381348586196886746758900465692833094336637178459072850215866106799456460266354416689624866015411034238864944123721969568161372557215009049887790769403406590484422511214573790761107726077762451440539965975955360773797196902546431341823788555069435728043202455375041817472821677779625286961992491729576392881089462100341878uwb
-    / 42uwb;
-constexpr unsigned _BitInt(16319) c
-  = 26277232382028447345935282100364413976442241120491848683780108318345774920397366452596924421335605374686659278612312801604887370376076386444511450318895545695570784577285598906650901929444302296033412199632594998376064124714220414913923213779444306833277388995703552219430575080927111195417046911177019070713847128826447830096432003962403463656558600431115273248877177875063381111477888059798858016050213420475851620413016793445517539227019973682699447952322388748860981947593432985730684746088183583225184347825110697327973294826205227564425769950503423435597165969299975681406974619941538502827193742760455245269483134360940023933986344217577102114800134253879530890064362520368475535738854741806292542624386473461274620987891355541987873664157022522167908591164654787501854546457737341526763516705032705254046172926268968997302379261582933264475402063191548343982201230445504659038868786347667710658240088825869575188227013335559298579845948690316856611693386990691782821847535492639223427223360712994033576990398197160051785889033125034223732954451076425681456628201904077784454089380196178912326887148822779198657689238010492393879170486604804437202791286852035982584159978541711417080787022338893101116171974852272032081114570327098305927880933671644227124990161298341841320653588271798586647749346370617067175316167393884414111921877638201303618067479025167446526964230732790261566590993315887290551248612349150417516918700813876388862131622594037955509016393068514645257179527317715173019090736514553638608004576856188118523434383702648256819068546345047653068719910165573154521302405552789235554333112380164692074092017083602440917300094238211450798274305773890594242881597233221582216100516212402569681571888843321851284369613879319709906369098535804168065394213774970627125064665536078444150533436796088491087726051879648804306086489894004214709726215682689504951069889191755818331155532574370572928592103344141366890552816031266922028893616252999452323417869066941579667306347161357254079241809644500681547267163742601555111699376923690500014172294337681007418735910341792131377741308586228268385825579773985382339854821729670313925456724869607910114957040810377671394779834675225181536565444830551924417794139736686594557660483813045525089850285373756403594900392226296617656189774567019900237644329891280192776067340109751100025818473155267503490628146429306493520953677660612094758307190480072039980575323428994009982415676875786338343681850769724258724712947129844865182522700509869810541147515988955709784790248266593581532414091983670376426534289079098742549505127694160521110700035496658932724007621759500091227595477831200325335242614162624218010753586306794482732500765136299548052958345872488446969032973871418565484570096440609125401439516349061951073344772753817168731533186740449206533184858409824331269879276752302819075938894191764603880669059804914705202932220114574769307945938446355744093058483466098741029671133305308451601510124097336668044362140994842230895354232007936193610666215236351383330719496758577095102466235782700820575938453736277546445932135116947993404356975890051717304128693125699951445791328843668647245439797933691355015781238038148597339831348341049751957204680813855138272253234219030458164179195368888878989362640509486440530112337687890165646824152338885218611665567933423652236621168833497594762922586523151554244316284075364923316223457798336995440229801638249044555841786652868778333857626201712694823945146208412572567947403078655159448178467488335673853886982143607843369103504905837049147006413324087204923968347162406372146304110247436210704329838033967549296094708909042352807942165389054391217609084676765464997803900415653278041220586434133698802658726748950122980183615091029049242919298428066745937148593879994539254240070220900694662200741796632687373414952817000938093930497338259168439649970963774406833411431113922194082765390241161715106142638681072839764035976877223152727829248475639970029777900589595383604989099084081251802305001465530685587689066710306032849298712531664047230963409638484129598076118133347670029704549206295184751171783054889490211218045322681317529569999778899567668829982207035948032411418382057247326141072264502161892285323531743728756335449414720326329614400327415751813608405440522389476951223717685562226240221655814783640319063683104993438443847695342093582440489676230855515734722099028773790309518629302472390856918840009781940193713784596688294176313226823907143925396584175086934911386332502448539920116580493698106175151294846382915609543814748269873022997601962804377576934064368480060369871027634248583037300264157126892396407333810094970488786868749240778818119777818968060847669660858189435863648299750130319878885182309492320093569553086644726783916663680961005542160003603514646606310756647257217877792590840884087816175376150368236330721380807047180835128240716072193739218623529235235449408073833764uwb
-    >> 171;
-static_assert (a == 10403542085759133691203342137159028259461894955438331210801665800234672962180907518788681055608925051917190662144445433835595489501570265148539013616306519011285861864113638610998587283343748668959870044400340187367869274012726759732348878437230149364081610941398977036594823591463255731808309715219781556045092524781748798096243155527048746090614751043610821560662864236720952557147844731917800712343725546175449104075627616077829385396994452199410766816558008090921987787438967590914249326913953731957899714113110918563882837045448642562338486517475793442626878243475178869958697311252767202125088496235928130685145568023992654921893286093433280015789621699281948053130963767216950901322064090115301029360256916486236324346980555378227825665231041206505932451054100655891377307183657244188881780309602697733965633806548575793711470844175477213922050584861112947113328821094578714380110663964395764964375008963336325761662071121014767368961020824065775639039724097407257977371623360602667242992626829630277589757195892131842788347638167481783472539736593840645020141666099662762763659119482517961624374850646183224354529879255694192077493038699570091875155722960929748259201284457182471153956119946261637096783796538046622701136421992223281799392319105563566498086105138357131671079600937329401554014025354725298453142629483842874038291307431207948198280389112036878226218928165845324560374437065373122000792930554833265840423016148390974876479752688661617125284208020330726704780298561478529279775092768807953202013307072084373090254748865483609183726295735240865516817482898554990450888147008484162850924835809973020042760450232447237837196378388135483084055028396408249214425019231777824054821326738728924661602608905318664721047678808734917923923121217803736039325080641571812479260200189082647677675380297657174607422686495562781202604884582727406463545308236800937463493199421020490845203940782000643133713413924683795888948837880891750307666957538835987772265423203470320354145742841869795472799186154631385288573730129094228733379855432514817031425884584962254283999586850250406406681047191820544352342046667950146374296364655891915135310082529994904874562441551527081311638121766367661807914647092917287784017613115795691373814041086838720316968010349263776702775009771662737124600992709418630470128579612748138807983617697487500079502839532266478317788699680283395230308668613168191852557234122469290277763000256531531071762280960597416576452124575885006363492171314551026369237325119844147154972582617127637240421323781252125819313268498872048683068789228870983086306586111793007178693570562554975762384431236664489360478109692520183356042112794589756922036102025380888246082763911915622037570736969677850621708281909652070776450422110772285659921383413532725137107621514770958361581240471968542997294446402584844918179956881219978405772785713402046471903103404871352324277109089891640558983922159359479964068994923538490500501798825116238188381267330618026093160290205596669795981834842352271011063939632623926629960113926326029952143452354640614061049438932665467928443113232214498101774523178129020155017228802221901469548072234073334681052461327832268955923701109732874360984002493130025470753861967432493102395766279717815113135763810886216491770265724160887688887515282293447287121039545323777928286876711267049135547760773655845950622676327972280622345486253084626121247885891757458308974259466441284967765824561478351421051923081842594791616249682768594796413184742007504540382141773556098929461233842797978566466734240436032269122908057438314319410489575244845739320693764798687398942275314333361838560358278583766983210126081046020231469705836544611252075187733112560778125560225565803349953151880800601890382648216375737077015744684142132303864494083237680306898134033570758401131735819237730280209424231954121970154195575070728876653187928423918894211617093567094857926079694003950142962763480728907322409338954277493711834363423032309296862081371923061150409402403668284066920335645815769603890931600189625120845560771835017710222988445713995722670892970377791415975424998772977793133120924108755323766471601770964843725827421304729349535336212587039242582503381150992918495310760366078232133800372960134691178665615437284018675587037783965019497398984583781291648236566997741116811234934754542646608973862932050896956712947890625239848619289180051302224085308716715734850608995498117691600907423641124622236235949675965926735290984369155077055324647942699875972019355174794849379024365265476001505043957802797349447782453767742359446787304217770032967959809288342189111153359045680464231699344620995535326063943372491385550455978845273436611631962336651743357242055102619760848116407351488643448217122169718350824452317641509534606434395208225350712889271762643740106849245478364448395994915755050465135468245061369394410933866013068008514339549345174558881983866497072827311379042433413uwb);
-static_assert (b == 479279632549833982755738215967357101486884905869453021516563898948915446591294289678884104882828483681018619007873937343032559095956110409690354224418625002966550159961834004740780330764422082810229193393826635058733624861250523067262019347540099774628575459315357616349150824579695313640630281667807589996920649924543478780215152006371546893079438057655154349456445174360590648508217399231758605134881847410713059287758746575793311941456361347290358374327775052253988819455767870384140373534325319062214637649448223675213701403987503519204500321584986093940400979311922337629196153927395934961423190792514929752893552191612781025930779806940809347748073488156862698382316586632554531097474068541478416687472958980350462147229542043370966376951612302580094672036569174235908042392792082009922861348754900810642762162386011767716267196524707159512614047405558309045526869231198654773018734270263596328291409529332649735222668150705420335319769465472201979730869384913211207207537399601373999069700655463720229201053332186006978582500927709712840419997653716343058563745053549481680514857956192457105651774755444712054911665735085740088242901976172465572034046597419519355833772202459754151176845548994456208445029222984100996313709454921745133168181790539412958897510447873469344071508368320478228160779533683887240349189576312875329064089835494782533898285493126755916970631488996451823585682342809043933704643566255965170014371156957508657356962712435465291272811967482363708516439065578762133187029479457794090439202070979801732536040880905419100375029921889772128503084510931435171483979018779597166630558819909348223770001377390273307373052030729413819617985823981374070443715485088829487365151686786653141560555397632839783786973475603908129103121125925582435377586599443363217659482486021512444715078999742145616192417054383275221431750185701711793487079447980295741809417265923372265027237884200396238493927359102885825948568128006352273465051712472070059202450319054451522388321059702003081513718019001071076161432358471155369959782811652330837503075288087426055655400029411438748293362031465017502577139252244731448555188613876936961036695236179942323751116112011014592974397486473882674592008130136792663493287323834319147915022427528033518178139180198551672004671264439595962120954122300129377851806213689047404966592261393005849755403969409681891387136302126214754577574214078992738385834194218500941354892714424617818676129678402812599649389519193939384481931712519965763571236544579269391714688112594004439937791027666527275028956096005024721892268353662349049501568931426746983749923266289936079664852088114380642027976981532748458314879741695023966059798072743350980348361092364278288527112580481417860547783209941006436630295569025708378983678708447667928300527961717504931897999052674925211486251029110033534138519456704647644914365911948549537915597987234033945431722519315974082307832411934886264333083916226707665948547147824941143774031630992986403589281430493343304207573431954440506367102005746914258775268625663056944615427077330312326664431034309894720122682694874274735620802316011315482410182991906165335883031756812018133914090861319389023790839528337203606889129436487920140167370284870924438860873830296648014424844378195912932551426780779819757525353368558050825303562419989528653425507781193568399131883673447888828695552112293654073088339775808234324436627659543962164946450396759723040075906766506152022264815158093674649622869572430121164843379253826764183953324829436751005035078152203675523168431161209463034491772102996315554878311000500752369796109685119745615468446576523546008325039060775520970963367909216533343057221662059707100715990114520515109428581554773471551782223970832412406073499896797949247197263055911053575580685552002226777990994346631851517791364630330551754443656577948498726362806681419705536740324268597539896282803552799726080554573302695958428417269671660306173853381343814024048279362738039470198839365706286164147555864933364363287875097138128425573909904433183795098670203800533548856219174579901097084123411402160448390274656216062207733804522678116007830485911118338137291415500040244636646228465275546613185451215477214924093897408659253897872331630294361379429268082112519489979283826532913282908147824847781517964779380824918394924322420104717839012960422523766744397106063463998218416521947089619846125464833145312281971994057275917591591279145274837283273569411904875883590818927011083766111368623876288661469697856984023924541117354584710728162060928747544449729071086406072820826707352705098469570212430005031769870770984490147544922541878582516496026055634218534739829767044431114272772863484628968800592047985977005687260574374332608765746965647976405949709304033414442630581488362251756922883517287565772653346189666094175256518980878632057889091042584644510374477219106080358138511257658994752983022904583136418485544787844335722425uwb);
-static_assert (c == 8779107423697189837569390605084121179785924908521985744210325591223667924519652625818373720019509245903707006132632572173386255064201355735198759440688262514780984111791042739566301784897316373994922192050963272288434060342288511971569697680026523760811225516430052699754044682818892679819131995600216280966062736732384732411361657444399695883865096103428759622813867735547259978529319436889864013687219390567604283318011100799953451520968441264866031813954488628058475114348729275414143158917874709599556247183695853838552321088973445876088042556810479910661449374661999675082811103814453353294194886612961492737263277271551889038610730760478459569256149321998350414023066363814989311109728311712989022996247280182587921449185353922885937877604500400738774240008709945289791605011177739657720181601453512259882004564462415828652714904289727235210537277721389816687643366145200001177712112197515695578887483792988755435401388456145854488880537088360397994643216014828495662460205686448548113229841097955613958440901375416256532864511852298696327611517233241324799070919491286426159788792631723833717451538043437364017185237743182402835670087683125602640318887451596650323528720128188198547270462971612157603487958526705005955580409441670771849388016438035850194585870327013409236236730914217722025655319472231141666790287955685713636274653565577454275838590350806168639165264676470440930351612992518904664647715805865941038423768376846697817543122409517591717292238745940345900530458551468519245767864531742102178628854376524513367983209186974575765707273973775386840081238803880335095740836386527208267311808973522450391189055739828936937359693167240524660624945856907042041257347192086984009640984509322622503890256046324768341632643546455779035376002061691113121234273164937984171774242327769915688742564049454163158318121818582764775268091292470889088445575108022688069271697198283151469645400870507006663799330661702702747443254220478311056407220749648103123435473381583520873055218734115120978678440455896458852497569989966723235965608706826593607128847630137618509151255834742636438796285569873869967729341871213521030011427372987388572674228441333458857512226049283243347521457804912008781036966786374760325341492033297848368160903260470019067535330611645909560888797451907088389764190403007998305168673029446934012245138838180596098559442570696150011296218144186387024615885302290744905340666905921743970013779813332493771192048043297281423248489056841417013807670308191095732464221451376997270745468459702152796818222745730565721202663103043121160101459833683249558684459108862536961994308535039970814557821268170388745941980378838969910592895670554291811739768771829941043857819603751246957962236091154755893962038363120690483862423001038948620681611253867149296463690417828034303547922792249098522404751428960713875050463906134150846089705714470303918299012691600285355859412924847760497076978432722446602521825089097454542343354847347396045079587757210635356999268706465425788833311190517623061860675230010994127196459030322166751571656642321690787471906609473496034789643710478162255664092991251446787887635351852933826820719781733754578161073401362668109819113924252291125741395271474342305574536974918273938513597418963787308994593434191890687730302495910686072338836413159162281072263542758257699588089838677469397467899348065293581751035844389848387161847435160327276066603683131703246410409122832793376751512688745195564021646069245992363396468100513536211651450610523315211697125774638845313243973083536417692075962486918844667432144353019722959653638632948294049984266861870151255315023346724671430499257993958049088066160870545025276597975154855537620265690354041028742742755074396597631965320380782500944568424053420038357524917125099241334990032189526465838192972110970861380060986802081948044345526414857158569939005895236672306344348212805851269920711043891306875873016330601673973249327072503571873518366750575070091051288590764788630190966776854031578939382690709022667421734442841784680826494146620589862829612704279521637740421694195051400095278084716974624615208392585573200182664157066813849346058321763156523965698465901396025152159642193562900743812715885811057212579017860488539960334406702752688595217360219470968738009774067915037157027492209108801337707562571266897723911401203374308490793226200974353356835311756384895692909802720948968131504604855466961987314701846460342135201914356152591684810924688350929140120187693089324255924634578576427004426339299493833434502951593902551451002292839635000904253250021884625417628756439862964325562720709528784964868687330847894476999577326582332350213148861205413652337499383416531545707272907994755638339630221576707954964236210962693804639714754668679841134928393081284209158098202683744650513918920168330598432362389777471870631039488408769354863001967531729415686631571754649uwb);
+constexpr unsigned _BitInt(16319) a = 468098567701677261276215481936770442254383643766995378241600227179396283432916865881332215867106489159251577495372085663487092317743244770597287633199005374998455333587280357490149993101811392051483761495987108264964738337118155155862715438910721661230332533185335581757600511846854115932637261969633134365868695363914570578110064471868475841348589366933645410987699979080140212849909081188170910464967486231358935212897096260626033055536141835599284498474737858487658470115144771923114826312283863035503700600141440724426364699636330240414271275626021294939422483250619629005959992243418661230122132667769781183790338759345884903821695590991577228520523725302048215447841573113840811593638413425054938213262961448317898574140533090004992732688525115004782973893244091427000396890427152225308661078954671066069234453757593181753900865203439035402480306413572239610467142591920809187367438071170100969567440044691427487959785637338381651309916782063670286046547585240837892307170928849485877186793280707600840866783471799148179250818387716183127323346199533387463363442356218803779697005759324410376476855222420876262425985571982818180353870410149824214544313013285199544193496624223219986402944849622489422007678564946174797892795089330899535624727777525330789492703574564112252955147770942929761545604350869404246558274752353510370157229485004402131043153454290397929387276374054938578976878606467217359398684275050519104413914286024106808116340712273059427362293703151355498336213170698894448405369398757188523160460292714875857879968173578328191358215972493513271297875634400793301929250052822258636015650857683023900709845410838487936778533250407886180954576046340697908584020951295048844938047865657029072850797442976146895294184993736999505485665742811313795405530674199848055802759901786376822069529342971261963119332476504064285869362049662083405789828433132154933242817432809415810548180658750393692272729586232842065658490971201927780014258815333115459695117942273551876646844821076723664040282772834511419891351278169017103987094803829594286352340468346618726088781492626816188657331359104171819822673805856317828499039088088223137258297373929043307673570090396947789598799922928643843532617012164811074618881774622628943539037974883812689130801860915090035870244061005819418130068390986470314677853605080103313411837904358287837401546257413240466939893527508931541065241929872307203876443882106193262544652290132364691671910332006127864146991404015366683569317248057949596070354929361158326955551600236075268435044105880162798380799161607987365282458662031599096921825176202707890730023698706855762932691688259365358964076595824577775275991183149118372047206055118463112864604063853894820407249837871368934941438119680605528546887256934334246075596746410297954458632358171428714141820918183384435681332379317541048252391710712196623406338702061195213724569303285402242853671386113148211535691685461836458295037538034378318055108240082414441205300401526732399959228346926528586852743389490978734787926721999855388794711837164423007719626109179005466113706450765269687580819822772189301084503627297389675134228222337286867641110511061980231247884533492442898936743429641958314135329073406495776369208158032115883850691010569048983941126771477990976092252391972812691669847446798507244106121667885423025613769258102773855537509733295805013313937402282804897213847221072647111605172349464564089914906493508133855389627177663426057763252086286325343811254757681803068276278048757997425284334713190226818463023074461900176958010055572434983135171145365242339273326984465181064287264645470832091115100640584104375577304056951969456200138485313560009272338228103637763863289261673258726736753407044143664079479496972580560534494806170810469304773005873590626280072387999668522546747985701599613975101188543857852141559251634058676718308000324869809628199442681565615662912626022796064414496106344236431285697688357707992989966561557171729972093533007476947862215922583204811189015550505642082475400647639520782187776825395598257421714106473869797642678266380755873356747812273977691604147842741151722919464734890326772594979022403228191075586910464204870254674290437668861177639713112762996390246102030994917186957826982084194156870398312336059100521566034092740694642613192909850644003933745129291062576341213874815510099835708723355432970090139671120232910747665906191360160259512198160849784197597300106223945960886603127136037120000864968668651452411048372895607382907494278810971475663944948791458618662250238375166523484847507342040066801856222328988662049579299600545682490412754483621051190231623196265549391964259780178070495642538883789503379406531279338866955157646654913405181879254189185904298325865503395688786311067669273609670603076582607253527084977744533187145642686236350165593980428575119329911921382240780504527422630654086941060242757131313184709635181001199631726283364158943337968797uwb;
+constexpr unsigned _BitInt(16319) b = 9935443518057456429927126655222257817207511311671335832560065573055276678747990652907348839741818562757939084649073348172108397183827020377941725983107513636287406530526358253508437290241937276908386282904353079102904535675608604576486162998319427702851278408213641454837223079616401615875672453250148421679223829417834227518133091055180270249266161676677176149675164257640812344297935650729629801878758059944090168862730519817203352341458310363811482318083270232434329317323822818991134500601669868922396013512969477839456472345812312321924215241849772147687455760224559240952737319009348540894966363568158349501355229264646770018071590502441702787269097973979899837683122194103110089728425676690246091146993955037918425772840022288222832932542516091501149477160856564464376910293230091963573119230648026667896399352790982611957569978972038178519570278447540707502861678502657905192743225893225663994807568918644898273702285483676385717651104042002105352993176512166420085064452431753181365805833548922676748890412420332694609096819779765600345216390394307257556778223743443958983962113723193551247897995423762348092103893683711373897139168289420267660611409947644548715007787832959251167553175096639147674776117973100447903243626902892382263767591328038235708593401563793019418124453166386471792468421003855894206584354731489363668134077946203546067237235657746480296831651791790385981397558458905904641394246279782746736009101862366868068363411976388557697921914317179371206444085390779634831369723370050764678852846779369497232374780691905280992368079762747352245519607264154197148958896955661904214909184952289996142050604821608749900417845137727596903100452350067551305840998280482775209883278873071895588751811462342517825753493814997918418437455474992422243919549967371964423457440287296270855605850954685912644303354019058716916735522533065323057755479803668782530250381988211075034655760123250249441440684338450953823290346909689822527652698723502872312570305261196768477498898020793071808758903381796873868682378850925211629392760628685222745073544116615635557910805357623590218023715832716372532519372862093828545797325567803691998051785156065861566888871461130133522039321843439017964382030080752476709398731341173062430275003111954907627837208488348686666904765710656917706470924318432160155450726007668035494571779793129212242101293274853237850848806152774463689243426683295884648680790240363097015218347966399166380090370628591288712305133171869639679922854066493076773166970190482988828017031016891561971986279675371963020932469337264061317786330566839383989384760935590299287963546863848119999451739548405124001514033096695605580766121611440638549988895970262425133218159848061727217163487131806481686766843789971465247903534853837951413845786667122427182648989156599529647439419553785158561613114023267303869927565170507781782366447011340851258178534101585950081423437703778492347448230473897643505773957385504112182446690585033823747175966929091293693201061858670141209129091452861292276276012910624071241165402089161606944423826245461608594935732481900198240862293409442308800690019550831630479883000579884614601906961723011354449804576794339826056986957680090916046848673419723529694384653809400377218545075269148766129194637039408225515678013332188074997217667835494940043014917877438354902673107453164275280010251040360040937308738925689475725131639032011979009642713542292894219059352972933151112376197383814925363288670995556269447804994925086791728136906693249507115097807060365872110998210768336078389508724184863597285987736912073071980137162590779664675033429119327855307827174673749257462983054221631797527009987595732460222197367608440973488211898471439302051388806818521659685873672383828021329848153410204926607710971678268541677584421695238011784351386047869158787156634630693872428067864980320063293435887574745859067024988485742353278548704467544298793511583587659713711677065792371199329419372392720321981862269890024832348999865449339856339220386853162641984444934998176248821703154774794026863423846665361147912580310179333239849314145158103813724371277156031826070213656189218428551171492579367736652650240510840524479280661922149370381404863668038229922105064658335083314946842545978050497021795217124947959575065471749872278802756371390871441004232633252611825748658593540667831098874027223327541523742857750954119615708541514145110863925049204517574000824797900817585376961462754521495100198829675100958066639531958106704159717265035205597161047879510849900587565746603225763129877434317949842105742386965886137117798642168190733367414126797929434627532307855448841035433795229031275545885872876848846666666475465866905332293095381494096702328649920740506658930503053162777944821433383407283155178707970906458023827141681140372968356084617001053870499079884384019820875585843129082894687740533946763756846924952825251383026364635539377880784234770789463152435704464616uwb;
+constexpr unsigned _BitInt(16319) c = a + b;
+constexpr unsigned _BitInt(16319) d = 20129744567093027275741005070628998262449166046517026903695683755854448756834360166513132405078796314602781998330705368407367482030156637206994877425582250124595106718397028199112773892105727478029626122540718672466812244172521968825004812596684190534400169291245019886664334632347203172906471830047918779870667296830826108769036384267604969509336398421516482677170697323144807237345130767733861415665037591249948490085867356183319101541167176586195051721766552194667530417142250556133895688441663400613014781276825394358975458967475147806589013506569415945496841131100738180426238464950629268379774013285627049621529192047736803089092751891513992605419086502588233332057296638567290306093910878742093500873864277174719410183640765821580587831967716708363976225535905317908137780497267444416760176647705834046996010820212494244083222254037700699529789991033448979912128507710343500466786839351071045788239200231971288879352062329627654083430317549832483148696514166354870702716570783257707960927427529476249626444239951812293100465038963807939297639901456086408459677292249078230581624034160083198437374539728677906306289960873601083706201882999243554025429957091619812945018432503309674349427513057767160754691227365332241845175797106713295593063635202655344273695438810685712451003351469460085582752740414723264094665962205140763820691773090780866423727990711323748512766522537850976590598658397979845215595029782750537140603588592215363608992433922289542233458102634259275757690440754308009593855238137227351798446486981151672766513716998027602215751256719370429397129549459120277202327118788743080998483470436192625398340057850391478909668185290635380423955404607217710958636050373730838469336370845039431945543326700579270919052885975364141422331087288874462285858637176621255141698264412903522678033317989170115880081516284097559300133507799471895326457336815172421155995525168781635131143991136416642016744949082321204689839861376266795485532171923826942486502913400286963940309484507484129423576156798044985198780159055788525538310878089397895175129162099671894337526801235280427428321205321530735108239848594278720839317921782831352363541199919557577597546876704462612904924694431903072332864341465745291866718067601041404212430941956177407763481845568339170224196193106463030409080073136605433869775860974939991008596874978506245689726966715206639438259724689301019692258116991317695012205036157177039536905494005833948384397446492918129185274359806145454148241131925838562069991934872329314452016900728948186477387223161994145551216156032211038319475270853818660079065895119923373317496777184177315345923787700803986965175033224375435249224949151191006574511519055220741174631165879299688118138728380219550143006894817522270338472413899079751917314505754802052988622174392135207139715960212346858882422543222621408433817817181595201086403368301839080592455115463829425708132345811270911456928961301265223101989524481521721969838980208647528038509328501705428950749820080720418776718084142086501267418284241370398868561282277848391673847937247873117719906103441015578245152673184719538896073697272475250261227685660058944107087333786104761624391816175414338999215260190162551489343436332492645887029551964578826432156700872459216605843463884228343167159924792752429816064841479438134662749621639560203443871326810129872763539114284811330805213188716333471069710270583945841626338361700846410927750916663908367683188084193258384935122236639934335284160522042065088923421928660724095726039642836343542211473282392554371973074108770797447448654428325845253304889062021031599531436606775029315849674756213988932349651640552571880780461452187094400408403309806507698230071584809861634596000425300485805174853406774961321055086995665513868382285048348264250174388793184093524675621762558537763747237314473883173686633576273836946507237880619627632543093619281096675643877749217588495383292078713230253993525326209732859301842016440189010027733234997657748351253359664018894197346327201303258090754079801393874104215986193719394144148559622409051961205332355846077533183278890738832391535561074612724819789952480872328880408266970201766239451001690274739141595541572957753788951050043026811943691163688663710637928472363177936029259448725818579129920714382357882142208643606823754520733994646572586821541644398149238544337745998203264678454665487925173493921777764033537269522992103115842823750405588538846833724101543165897489915300004787110814394934465518176677482202804123781727309993329004830726928892557850582806559007396866888620985629055058474721708813614135721948922060211334334572381348586196886746758900465692833094336637178459072850215866106799456460266354416689624866015411034238864944123721969568161372557215009049887790769403406590484422511214573790761107726077762451440539965975955360773797196902546431341823788555069435728043202455375041817472821677779625286961992491729576392881089462100341878uwb;
+constexpr unsigned _BitInt(16319) e = d / 42uwb;
+constexpr unsigned _BitInt(16319) f = 26277232382028447345935282100364413976442241120491848683780108318345774920397366452596924421335605374686659278612312801604887370376076386444511450318895545695570784577285598906650901929444302296033412199632594998376064124714220414913923213779444306833277388995703552219430575080927111195417046911177019070713847128826447830096432003962403463656558600431115273248877177875063381111477888059798858016050213420475851620413016793445517539227019973682699447952322388748860981947593432985730684746088183583225184347825110697327973294826205227564425769950503423435597165969299975681406974619941538502827193742760455245269483134360940023933986344217577102114800134253879530890064362520368475535738854741806292542624386473461274620987891355541987873664157022522167908591164654787501854546457737341526763516705032705254046172926268968997302379261582933264475402063191548343982201230445504659038868786347667710658240088825869575188227013335559298579845948690316856611693386990691782821847535492639223427223360712994033576990398197160051785889033125034223732954451076425681456628201904077784454089380196178912326887148822779198657689238010492393879170486604804437202791286852035982584159978541711417080787022338893101116171974852272032081114570327098305927880933671644227124990161298341841320653588271798586647749346370617067175316167393884414111921877638201303618067479025167446526964230732790261566590993315887290551248612349150417516918700813876388862131622594037955509016393068514645257179527317715173019090736514553638608004576856188118523434383702648256819068546345047653068719910165573154521302405552789235554333112380164692074092017083602440917300094238211450798274305773890594242881597233221582216100516212402569681571888843321851284369613879319709906369098535804168065394213774970627125064665536078444150533436796088491087726051879648804306086489894004214709726215682689504951069889191755818331155532574370572928592103344141366890552816031266922028893616252999452323417869066941579667306347161357254079241809644500681547267163742601555111699376923690500014172294337681007418735910341792131377741308586228268385825579773985382339854821729670313925456724869607910114957040810377671394779834675225181536565444830551924417794139736686594557660483813045525089850285373756403594900392226296617656189774567019900237644329891280192776067340109751100025818473155267503490628146429306493520953677660612094758307190480072039980575323428994009982415676875786338343681850769724258724712947129844865182522700509869810541147515988955709784790248266593581532414091983670376426534289079098742549505127694160521110700035496658932724007621759500091227595477831200325335242614162624218010753586306794482732500765136299548052958345872488446969032973871418565484570096440609125401439516349061951073344772753817168731533186740449206533184858409824331269879276752302819075938894191764603880669059804914705202932220114574769307945938446355744093058483466098741029671133305308451601510124097336668044362140994842230895354232007936193610666215236351383330719496758577095102466235782700820575938453736277546445932135116947993404356975890051717304128693125699951445791328843668647245439797933691355015781238038148597339831348341049751957204680813855138272253234219030458164179195368888878989362640509486440530112337687890165646824152338885218611665567933423652236621168833497594762922586523151554244316284075364923316223457798336995440229801638249044555841786652868778333857626201712694823945146208412572567947403078655159448178467488335673853886982143607843369103504905837049147006413324087204923968347162406372146304110247436210704329838033967549296094708909042352807942165389054391217609084676765464997803900415653278041220586434133698802658726748950122980183615091029049242919298428066745937148593879994539254240070220900694662200741796632687373414952817000938093930497338259168439649970963774406833411431113922194082765390241161715106142638681072839764035976877223152727829248475639970029777900589595383604989099084081251802305001465530685587689066710306032849298712531664047230963409638484129598076118133347670029704549206295184751171783054889490211218045322681317529569999778899567668829982207035948032411418382057247326141072264502161892285323531743728756335449414720326329614400327415751813608405440522389476951223717685562226240221655814783640319063683104993438443847695342093582440489676230855515734722099028773790309518629302472390856918840009781940193713784596688294176313226823907143925396584175086934911386332502448539920116580493698106175151294846382915609543814748269873022997601962804377576934064368480060369871027634248583037300264157126892396407333810094970488786868749240778818119777818968060847669660858189435863648299750130319878885182309492320093569553086644726783916663680961005542160003603514646606310756647257217877792590840884087816175376150368236330721380807047180835128240716072193739218623529235235449408073833764uwb;
+constexpr unsigned _BitInt(16319) g = f >> 171;
+static_assert (c == 10403542085759133691203342137159028259461894955438331210801665800234672962180907518788681055608925051917190662144445433835595489501570265148539013616306519011285861864113638610998587283343748668959870044400340187367869274012726759732348878437230149364081610941398977036594823591463255731808309715219781556045092524781748798096243155527048746090614751043610821560662864236720952557147844731917800712343725546175449104075627616077829385396994452199410766816558008090921987787438967590914249326913953731957899714113110918563882837045448642562338486517475793442626878243475178869958697311252767202125088496235928130685145568023992654921893286093433280015789621699281948053130963767216950901322064090115301029360256916486236324346980555378227825665231041206505932451054100655891377307183657244188881780309602697733965633806548575793711470844175477213922050584861112947113328821094578714380110663964395764964375008963336325761662071121014767368961020824065775639039724097407257977371623360602667242992626829630277589757195892131842788347638167481783472539736593840645020141666099662762763659119482517961624374850646183224354529879255694192077493038699570091875155722960929748259201284457182471153956119946261637096783796538046622701136421992223281799392319105563566498086105138357131671079600937329401554014025354725298453142629483842874038291307431207948198280389112036878226218928165845324560374437065373122000792930554833265840423016148390974876479752688661617125284208020330726704780298561478529279775092768807953202013307072084373090254748865483609183726295735240865516817482898554990450888147008484162850924835809973020042760450232447237837196378388135483084055028396408249214425019231777824054821326738728924661602608905318664721047678808734917923923121217803736039325080641571812479260200189082647677675380297657174607422686495562781202604884582727406463545308236800937463493199421020490845203940782000643133713413924683795888948837880891750307666957538835987772265423203470320354145742841869795472799186154631385288573730129094228733379855432514817031425884584962254283999586850250406406681047191820544352342046667950146374296364655891915135310082529994904874562441551527081311638121766367661807914647092917287784017613115795691373814041086838720316968010349263776702775009771662737124600992709418630470128579612748138807983617697487500079502839532266478317788699680283395230308668613168191852557234122469290277763000256531531071762280960597416576452124575885006363492171314551026369237325119844147154972582617127637240421323781252125819313268498872048683068789228870983086306586111793007178693570562554975762384431236664489360478109692520183356042112794589756922036102025380888246082763911915622037570736969677850621708281909652070776450422110772285659921383413532725137107621514770958361581240471968542997294446402584844918179956881219978405772785713402046471903103404871352324277109089891640558983922159359479964068994923538490500501798825116238188381267330618026093160290205596669795981834842352271011063939632623926629960113926326029952143452354640614061049438932665467928443113232214498101774523178129020155017228802221901469548072234073334681052461327832268955923701109732874360984002493130025470753861967432493102395766279717815113135763810886216491770265724160887688887515282293447287121039545323777928286876711267049135547760773655845950622676327972280622345486253084626121247885891757458308974259466441284967765824561478351421051923081842594791616249682768594796413184742007504540382141773556098929461233842797978566466734240436032269122908057438314319410489575244845739320693764798687398942275314333361838560358278583766983210126081046020231469705836544611252075187733112560778125560225565803349953151880800601890382648216375737077015744684142132303864494083237680306898134033570758401131735819237730280209424231954121970154195575070728876653187928423918894211617093567094857926079694003950142962763480728907322409338954277493711834363423032309296862081371923061150409402403668284066920335645815769603890931600189625120845560771835017710222988445713995722670892970377791415975424998772977793133120924108755323766471601770964843725827421304729349535336212587039242582503381150992918495310760366078232133800372960134691178665615437284018675587037783965019497398984583781291648236566997741116811234934754542646608973862932050896956712947890625239848619289180051302224085308716715734850608995498117691600907423641124622236235949675965926735290984369155077055324647942699875972019355174794849379024365265476001505043957802797349447782453767742359446787304217770032967959809288342189111153359045680464231699344620995535326063943372491385550455978845273436611631962336651743357242055102619760848116407351488643448217122169718350824452317641509534606434395208225350712889271762643740106849245478364448395994915755050465135468245061369394410933866013068008514339549345174558881983866497072827311379042433413uwb);
+static_assert (e == 479279632549833982755738215967357101486884905869453021516563898948915446591294289678884104882828483681018619007873937343032559095956110409690354224418625002966550159961834004740780330764422082810229193393826635058733624861250523067262019347540099774628575459315357616349150824579695313640630281667807589996920649924543478780215152006371546893079438057655154349456445174360590648508217399231758605134881847410713059287758746575793311941456361347290358374327775052253988819455767870384140373534325319062214637649448223675213701403987503519204500321584986093940400979311922337629196153927395934961423190792514929752893552191612781025930779806940809347748073488156862698382316586632554531097474068541478416687472958980350462147229542043370966376951612302580094672036569174235908042392792082009922861348754900810642762162386011767716267196524707159512614047405558309045526869231198654773018734270263596328291409529332649735222668150705420335319769465472201979730869384913211207207537399601373999069700655463720229201053332186006978582500927709712840419997653716343058563745053549481680514857956192457105651774755444712054911665735085740088242901976172465572034046597419519355833772202459754151176845548994456208445029222984100996313709454921745133168181790539412958897510447873469344071508368320478228160779533683887240349189576312875329064089835494782533898285493126755916970631488996451823585682342809043933704643566255965170014371156957508657356962712435465291272811967482363708516439065578762133187029479457794090439202070979801732536040880905419100375029921889772128503084510931435171483979018779597166630558819909348223770001377390273307373052030729413819617985823981374070443715485088829487365151686786653141560555397632839783786973475603908129103121125925582435377586599443363217659482486021512444715078999742145616192417054383275221431750185701711793487079447980295741809417265923372265027237884200396238493927359102885825948568128006352273465051712472070059202450319054451522388321059702003081513718019001071076161432358471155369959782811652330837503075288087426055655400029411438748293362031465017502577139252244731448555188613876936961036695236179942323751116112011014592974397486473882674592008130136792663493287323834319147915022427528033518178139180198551672004671264439595962120954122300129377851806213689047404966592261393005849755403969409681891387136302126214754577574214078992738385834194218500941354892714424617818676129678402812599649389519193939384481931712519965763571236544579269391714688112594004439937791027666527275028956096005024721892268353662349049501568931426746983749923266289936079664852088114380642027976981532748458314879741695023966059798072743350980348361092364278288527112580481417860547783209941006436630295569025708378983678708447667928300527961717504931897999052674925211486251029110033534138519456704647644914365911948549537915597987234033945431722519315974082307832411934886264333083916226707665948547147824941143774031630992986403589281430493343304207573431954440506367102005746914258775268625663056944615427077330312326664431034309894720122682694874274735620802316011315482410182991906165335883031756812018133914090861319389023790839528337203606889129436487920140167370284870924438860873830296648014424844378195912932551426780779819757525353368558050825303562419989528653425507781193568399131883673447888828695552112293654073088339775808234324436627659543962164946450396759723040075906766506152022264815158093674649622869572430121164843379253826764183953324829436751005035078152203675523168431161209463034491772102996315554878311000500752369796109685119745615468446576523546008325039060775520970963367909216533343057221662059707100715990114520515109428581554773471551782223970832412406073499896797949247197263055911053575580685552002226777990994346631851517791364630330551754443656577948498726362806681419705536740324268597539896282803552799726080554573302695958428417269671660306173853381343814024048279362738039470198839365706286164147555864933364363287875097138128425573909904433183795098670203800533548856219174579901097084123411402160448390274656216062207733804522678116007830485911118338137291415500040244636646228465275546613185451215477214924093897408659253897872331630294361379429268082112519489979283826532913282908147824847781517964779380824918394924322420104717839012960422523766744397106063463998218416521947089619846125464833145312281971994057275917591591279145274837283273569411904875883590818927011083766111368623876288661469697856984023924541117354584710728162060928747544449729071086406072820826707352705098469570212430005031769870770984490147544922541878582516496026055634218534739829767044431114272772863484628968800592047985977005687260574374332608765746965647976405949709304033414442630581488362251756922883517287565772653346189666094175256518980878632057889091042584644510374477219106080358138511257658994752983022904583136418485544787844335722425uwb);
+static_assert (g == 8779107423697189837569390605084121179785924908521985744210325591223667924519652625818373720019509245903707006132632572173386255064201355735198759440688262514780984111791042739566301784897316373994922192050963272288434060342288511971569697680026523760811225516430052699754044682818892679819131995600216280966062736732384732411361657444399695883865096103428759622813867735547259978529319436889864013687219390567604283318011100799953451520968441264866031813954488628058475114348729275414143158917874709599556247183695853838552321088973445876088042556810479910661449374661999675082811103814453353294194886612961492737263277271551889038610730760478459569256149321998350414023066363814989311109728311712989022996247280182587921449185353922885937877604500400738774240008709945289791605011177739657720181601453512259882004564462415828652714904289727235210537277721389816687643366145200001177712112197515695578887483792988755435401388456145854488880537088360397994643216014828495662460205686448548113229841097955613958440901375416256532864511852298696327611517233241324799070919491286426159788792631723833717451538043437364017185237743182402835670087683125602640318887451596650323528720128188198547270462971612157603487958526705005955580409441670771849388016438035850194585870327013409236236730914217722025655319472231141666790287955685713636274653565577454275838590350806168639165264676470440930351612992518904664647715805865941038423768376846697817543122409517591717292238745940345900530458551468519245767864531742102178628854376524513367983209186974575765707273973775386840081238803880335095740836386527208267311808973522450391189055739828936937359693167240524660624945856907042041257347192086984009640984509322622503890256046324768341632643546455779035376002061691113121234273164937984171774242327769915688742564049454163158318121818582764775268091292470889088445575108022688069271697198283151469645400870507006663799330661702702747443254220478311056407220749648103123435473381583520873055218734115120978678440455896458852497569989966723235965608706826593607128847630137618509151255834742636438796285569873869967729341871213521030011427372987388572674228441333458857512226049283243347521457804912008781036966786374760325341492033297848368160903260470019067535330611645909560888797451907088389764190403007998305168673029446934012245138838180596098559442570696150011296218144186387024615885302290744905340666905921743970013779813332493771192048043297281423248489056841417013807670308191095732464221451376997270745468459702152796818222745730565721202663103043121160101459833683249558684459108862536961994308535039970814557821268170388745941980378838969910592895670554291811739768771829941043857819603751246957962236091154755893962038363120690483862423001038948620681611253867149296463690417828034303547922792249098522404751428960713875050463906134150846089705714470303918299012691600285355859412924847760497076978432722446602521825089097454542343354847347396045079587757210635356999268706465425788833311190517623061860675230010994127196459030322166751571656642321690787471906609473496034789643710478162255664092991251446787887635351852933826820719781733754578161073401362668109819113924252291125741395271474342305574536974918273938513597418963787308994593434191890687730302495910686072338836413159162281072263542758257699588089838677469397467899348065293581751035844389848387161847435160327276066603683131703246410409122832793376751512688745195564021646069245992363396468100513536211651450610523315211697125774638845313243973083536417692075962486918844667432144353019722959653638632948294049984266861870151255315023346724671430499257993958049088066160870545025276597975154855537620265690354041028742742755074396597631965320380782500944568424053420038357524917125099241334990032189526465838192972110970861380060986802081948044345526414857158569939005895236672306344348212805851269920711043891306875873016330601673973249327072503571873518366750575070091051288590764788630190966776854031578939382690709022667421734442841784680826494146620589862829612704279521637740421694195051400095278084716974624615208392585573200182664157066813849346058321763156523965698465901396025152159642193562900743812715885811057212579017860488539960334406702752688595217360219470968738009774067915037157027492209108801337707562571266897723911401203374308490793226200974353356835311756384895692909802720948968131504604855466961987314701846460342135201914356152591684810924688350929140120187693089324255924634578576427004426339299493833434502951593902551451002292839635000904253250021884625417628756439862964325562720709528784964868687330847894476999577326582332350213148861205413652337499383416531545707272907994755638339630221576707954964236210962693804639714754668679841134928393081284209158098202683744650513918920168330598432362389777471870631039488408769354863001967531729415686631571754649uwb);
+
+__attribute__((noipa)) unsigned _BitInt(16319)
+foo (unsigned _BitInt(16319) a, unsigned _BitInt(16319) b)
+{
+  return a + b;
+}
+
+__attribute__((noipa)) unsigned _BitInt(16319)
+bar (unsigned _BitInt(16319) a, unsigned _BitInt(16319) b)
+{
+  return a / b;
+}
+
+__attribute__((noipa)) unsigned _BitInt(16319)
+baz (unsigned _BitInt(16319) a, unsigned _BitInt(16319) b)
+{
+  return a >> b;
+}
+#endif
+
+int
+main ()
+{
+#if __BITINT_MAXWIDTH__ >= 16319
+  if (foo (a, b) != c || bar (d, 42uwb) != e || baz (f, 171uwb) != g)
+    __builtin_abort ();
 #endif
+}
diff --git a/gcc/testsuite/gcc.dg/bitint-39.c b/gcc/testsuite/gcc.dg/bitint-39.c
new file mode 100644
index 00000000000..1782abda3c0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/bitint-39.c
@@ -0,0 +1,43 @@
+/* PR c/102989 */
+/* { dg-do run { target { bitint } } } */
+/* { dg-options "-std=c2x" } */
+
+#if __BITINT_MAXWIDTH__ >= 65472
+constexpr unsigned _BitInt(65472) a = 65874028414853418769511496113653036945710467528674240836188871502976748745763974525826911024024988631776491096261751992694895296214498585327384601121850230477827515082843619768846499801840836477230687590770231681718268338714887172330888785411211246357940293072535006266916583089772232445667160886208448607927748489013059344141951625673199213945267073377588652374198634016718719257659199541018970117033192039851653491638992986532515557336069337719046396088060414869427270972708809318734227046883806081011951941853679439848321781173016681200685359617693806920032604807641414656615976627881030905633504995608500926313100449123752592887306455273713086084720226711163858729450345307982160835189085198339193053545528326363004277216519521996803653047233696840937893926439475024000274633924716672022043462512673682343650888234611610847904449303938980580750614829479521364941526248038103556791184166137132891705498670203747450648138794675915927809475689266431674447401721770257807894864574772637777546833262526951307916013054159424871918674386303422478917660124313218179561460069927914109853781325554791226906771269776791232118969314470480394982481391738558649576936680153086613697764141243587961259345656781466911451311347049773832249980208428530724233103217369963103642890811580190014250767734527431460062555356767163656837728658921843437422091225040343040245536763579475902218857185893576553568913202523567943581185934074140454243365677691321402599868371075480132367548064644179457549106582668003278353839811901755098775042915492192962256439240717885562228560807300368546591938513564249673935563354224669505426548315283725161174366021701375396395313621732692448055488113835736519133847733806933661608336123237017767589792413707136130610229516496362268872996002408911802982404007464241164929849341909484070765678046190680486057484835560562448063002010171248868062856794398851279347048705720960974749673146662296765976038110218870942100630056574273343812309347877934257043013803766940137680754965100302990989281818211387137383832600675317434920893732120105407723736041635958085676519190305809361514850656066374765384629954359307080862256105691419898168955679806156443004466405913142123628524231555115399711321193475052976374230374739915275763990520499641653144284448959338924397090731568126860006699218100212808418951593973346259258754997140003401228249592046733643429633842927437674005630309466335475488976044970815680337796705251785679176317921969250255914644143927301143156940750728409691193837462118411451140103456466642917621794037963804154558563563784540744625286045320380647149505894465602074709712052403213672513944120580472196908870481008605753502378254869195510822476848807886998210212224568817665331382282682183443019436910934518254905570403017861343476981516822213043567878416094061997484366094926060989684786188719853361377592613245034788253106057223977996442867392634883776229675223227731721808083021736947720678172726157569358655251453763272147556197009586238264046136725977202440532459363521159216893005875943650891355683793285122481839809223042446177899018320884858378858428482004887350002248475654126695437381791039346060525159596388199191045220810622260461623488951548300045143031946225548627356322494072635246741690369797703750001744527651635248045159165227990904076792563599086736013143689002450121560791866918627656264249547156379687514841821979600884946973379386059970849524777822542279884834069088756993835503335163308439818940407550289076454404410002526269749323403673331561005855976564163112359624884449722076806747002050900060486557888988389190561491837653913417576996782073392887675547243908721620711696799096385497090726000898536841269644251102949559919330359725680095583471880505317680844666709274840966390417748140336028128180466837002340200275922083519953988906089254843320339560405442077901688830870404393361047302469466448124739846498711286663890861622125303854725244017935265801954966781478807230955537079573035800508809193696776558659380041474673947719614891591483335826961674762867599639802412473648680441069062029676465317014339608126488486239504818779896608289143566814074344128163474927248996300958043211993182818053822887583188270715520756855009877038634425539657265881288715061989818229395878573316718153726750826355803265260984266618144751818838129431927560052524725127582765549442372461635957790507428542296212660482883830778100032262628335685268361076110653003933720753658626342498598108207113591628523223931344937962257434088745568685381473222813754713557301137685188707577771735719907385875925945361215971464704808214927499603711487344132091326731184707081884630565832911532419130163514966778562434847861021362218993469451376667702490745897248165073801412613710459059823342004801266188992270518474584690584110796775040192964553128155321278735400418222301274509554699483242906248842528643927491916050334115601214082061834286251573797771471610462890207070038990113517384314874988389218929593573595769992957934439472313648608872221417538591099909547681713055197851963217806394271932283786418963737083378263837851866770792294581430370179812803807766812134735008944094254924133000181138341444754146592554240244926530488085797161607440296312032375671384766799546314294952639429116053444305204179954961737670754928180951211327209631174491438566704748775957423647631106931872353072411758039523701355399245986495256131899939578128637906193987861515696267624022768855677386145040750676905386076271594075012645017847456843861067907361603785482067517607711397078496893391404908466039763474426356995787412728936302077788321037622089836944185920214948667492076372211507958383725993147568828022520584628113743069072098077681737646616832744282683301027940111008949487559489400280166812162349769417565580841259074013682180200573711186777726659689975490119163357473183919117291539140678034476458394800768806683673132266242343880852243749183854335527770813216391997262974885810843114429314160237463276656664218915730925460828760711378046669902410716387688714853282313680765227107400697209645981183025449661912571103890490913039864188897637949556486744952841792160388971558166205393610932705442433631027753841798811000777130265365602851965515681643984169325435610742993940251263241305792519709217930230875279761194839959584662947191743403356700820347334268850390650844637405501531301921096571026263943432066459294971843089035394861220552532758517810050362565876624718715634556912646641949968260622504116224630219284301623921188277675205384056375364778072061649987278221213051902862594711798265704318920329526303415071651490215159169436665502967051371583199355417397040849618260976239182865708899876580220885148819958098892407447384776849540577596373076572931387032303318606938946805395609756474317173037851890190086080334220234266081872276699590277311605725492019621206245108261399321173649438883031907502103004618343981447073270063780499728342099870986514585907891949892308658040261024667776373424978390909682927910796351757483974443865702371792838882771005747543496062821233816175876149479890010870200215632229210706418785910292789638550348725797240661293132307251159131784402794068309831964186085953199517245335059417823074979114015927625438852575505515547130205018453380351113945679912359116614886302675918646948307265762938004110601513658895196700081824586705020282825093739598881081540708217418131914073953341509242444578622435984145983493347604029272854899321609106849286714028483886414825128479818859724734438344906945298606455406699287820316660695989544913612976004949026573679384907850688667479190435572179237006408685754560762141977321367339517301097820953022755318954649838568359278646708109095740043295665248217530811189495831329465924529060656867586984790794628582957651073768585090489278140555182834690421510195303839613545873092108913694594537183285417682903243454311391369375810654906662974651031976593576633213427096627363649424527674138186816206523669842323707281027980506733634096495865602720885328039147475167492532627097604997707385503393991456792672459352936820122822469556596945676396903590546739682393729575454493944807057345819069181271569904644175551803259147445317231361820692382321822423289376965920517760072762131028848540838123733912106843655308311750496550815033703056692798798011918005011348199727933997069164542544843124651534694478753855625309629960678863623815672915274926726965714364858257611221106385074050699918280948177141442387115797213194242870596023564029577989498938485534058029690537190534744252272824857327493965876618976643677984346169877601719298683399281042997338804443874233186946808040598508364557521255575013579815682146068863549337248303001248078807047378108920762143811221461759354620875369589065024312588898065507971561029929345527858159313129820327669633132293160565999400466976147547125003253164886640290777125287017292361727094985547014756417512102317970262384641051079277427351725574074131116107146600399234403647819323600759586671280733725982209124764267999221147483008839140602670257205078780970624480127071396543158542953522136110465710368242064084840890205082187266645629140357952494765688460918507878486426042065278647584015295279651155982623258616377485606104157632043716067693156340573589748375359059722913343059515310846221532353844339794755668848402309080774422293295651170084782844354070621520168937868316086040235069146058345289688192907685918900389066798118530800450286088002427616043549842138481236713776013883531628590595300042847329197168381891936968101967776014081901912034332263670677828204428422384434715718704595120461430375574175765702011953092786008531618841562463621545904938593447520015052398913473747165675739128227729860522837856493359404981275620405156088407724873896814306917527150300142982470028171920769744429179320431741610875850043999674743188496908160129431272106464679454201996897333414256543788368259896759637862338268498926658644196226425393282232669383401043410041622131834269331249053253163263805617292232014554953766603366944449281936436163348007550264881313734403499866885910422096847245868983837395381509905362814510495294417227071475516750438538914922504534834593033205080900795488912148742019119549014001554366911119067584994744299018308039208210417466906415185076706749205801012799329399986289204986294786437588639612782571971507723771937929701163710244163043404564826267800950589676152533594989418618014288641614520385570184240884586130870870741886347468641829857183453740491569842565622064996027914799445938815414612045489948609894048719358464589599498624644809962127765563981065415756251258118421436949142446606626464150436046745354962830933231617087191036634528282763930864590672989015325808346540917086018285482216294776630407604444017209836386813546251369184558393180862727824133618231105407565377726874201016716874747193298110226548713113055804386335542276584785327642141420979789128607575389126059449056231221655504322975168824547921598754212580284860341317067232171503075318659142194545497016145803181512026343421286297638468103352223053704896868265116206256544679438575897966426762874745106558292347134875728572127325337754733765251105470177415270966206899861267252369448068927266102835975020557437913164840102135985178231875990189340734544654744647827441286010902235438982564998068477390121580268067852517302500958493927727155669887335454802232441766876959727296032213883872141451322900261005024406412638925534447309297109774680653396839068981982303959449585919601951784676269338509798444492284027198527534729264816863223855205480827392176674198533541998652285208950844368772121015938775827868718348053651466660945842822857135950701469458166244446036560410696408598768008796242326788817178564489668276079897020785729862548025216683403145162467545641729518620497596028019199039246447845134132855463133735174323788649842018758419435906318743206053356800088370917852318294527105533345230477001222310383402828126358397712503413591645611054601866497386469412638491773728614643382590286186308330017723253240683781406419919818813502414034869402770627046602136910556735340620577006649826384200614066464173557086745764379665102794298748986565199421337796563169859800331533497258203854653725133871631985474523134061290217790871839012014060652170431386706390526266713354909666532894989712338707426377288105959729380930582675275553400044698473843175010204608057871421993855679325795511343440323540375249581001966431109313820512103729737415876492397855350709356620428053728631513279657137136751691815273101807269203767363250781488995922177169506473238033222632470640191052132325977988500916888797348877819383961059260577892204584222324373872871821748974613401628203875338762555211387910748411152327539619567997694542831475663395895555090404922654858513105597129946139446385944075046977527087443129745077809595756576233514427417022666744060487857898390789948480719931806881956529624868523931326204018924742455510988728560620886881508902552006781252685182126521983698023601752690226917489683075686040459944761124984353820735928331227975669811495025536004835557357866887952405925158206358648460053744971810759800516971341251283976744691594110219822376535068050425606180275339861939768053672977590839860433707369056754028768873245370748243872093908425321452790676005744239063004090812287994171654371534280527461204785965744686899037505526748205474829861508775633341610106216825084287086663714002411976655574453853711919148720158805545980786494280975922278491841813051023374114075744194873828536865132926198728339588170375472796201352742410432853435729363112226201941628255002535490275056766586373821459331811284350772302429368659539685224295962240105465692745743117250558134122530552966969305908586250082284865580325406190790343864287037227316258520732020059190355270848306662653818702002897039308630618431243314449931945150585878901504845973215101937953823928461721757938572553687288827606914187939448631587847341567152264836920949873736396479054462466993545281884314888041635210657865924492733477634678092762053049423724420978749565535935202527272735525538857856532535829727403758248515676377734964271319895603733369499282090619370644390912703118190967699735839422150118676090812589197956828432883454591775506142072991995255477162685456179917844477810916117758366522467183885517800565518850836567463260579936570404378905085631880126835957647088321534365595303983957495652572590640830763831479030713794949481583992861854626122255507636651728698938040296394529620734556222565311409570754214795520535003346400553934254868951469742466063081282009587365288248731116040001268793498485153779630516908276030764263795595829834765298430173859886036974114210469592900822522496578393807022364135855868617791972115817676751055814736691157277719078078363722995682352787453931398544225888615155245513172842244076107970477685087347438625378887619302413866466619117008334792748656074141300284702324314107158575021092021045201219104849568044014318163216648167167102545567590192051572811882759399171815091482243321889561619871953313830812925825376241612376634587322435846044799053536631550927269169032948586514626083989734654942487786073128339707925635994571914892483303685762083840487806131930731387849170685349079864020207179382689618594010162070659159447889344283707204286255036729730123415253795453381392363525730409662963512930464146567702953413882972452890687402324823676434623668607417451713252684608112007770743378032124178068076627655591705783142289469636449645674093183854831679943102480054334422336004642534472137802293959591564047787165742281711262045913463889166614975785367285123231848489964947168259259859651331806294100233514606935240876224388286907295795623525145565485264076203685696921301244157049222399694261123517677386771518164905737344603978252996052580868902923124475552914011730528812300179021230309867253769880851013594703320917123515967493597713163002806913617288734951731859626757112576606989339415205916570757259477367425003980820415407690284037569443414621271531087857711540292395118940327930085917648961413854880713533683379365683118321440194053278494655321531901445796224168264056771141704976004602347371222102339725674327295424584923438972729801604160881606371129484752571956550759895866459266634599318934331132992268419492312051515244634605489726581981774372625890847390663222639677778599130509229036502941438146903740421129745765409463741046041724109743995541832910890810043237637250838512421266274159269838087162966877339415320918445838084607926482487326890808603331454937071756872582541587950869617374867497291942434166388340736188426522646778126260187474459305273317048369223194305392592429269796065446394224285706245837186991386807972768134945406804843677986121363618283994623075786820519030677924524631232773053566327068836914008068880508593892814413599933512127846256450189605965007722408749599327105633360191669226811125705464166865932685139499043188417058408145619475137407704309057096253453970943431010208805958880441668536636630984528024738383726952579394912266155766194059496573034122939179354744906886317447299846294675145801761429867331920860320689436106861896387056042301081513818264319294187170363122704106526138368915635603316494940799629455580847884255301629707874127819875328740309245368068925386845081146527751898281929519183808884694732922929381859998068561552287796638630153557107517603976885737408961385726894117817772124305384275773752681561772589162896726543848118292224854735017911552771598879672195419903142467189758288893617797981332645308463000380199968291172662286342433407530992399311582382371037051384107721693674935016059465473282177680148455402959465472212928981753238596329614601855483413398833842270568295296640743598590779752989551301629995771523000231911679050279485698305095423321484021804360883790254659446161386801194534079288499545690468910577746611299797864563154863490832639144410652702292169488612519356587316152787229543906355470677554502438539602268426767473565515536424169935736875415273620834081490730213150398951736650842108450857240742774594217852879173672688751229305531115825014850231000546945150122964624749643195594303796058701805941210884086651903723484629069594503110445498020891082678423358251793036052092074949457345902128190663782180041297332240668738760754685732067836519097118357790131727679935781054122263807112935237022613351668926147398489883137771515688789600851256388568716495659230435230035583859074576720408679091908831650422755099588394054135377265310497551564802196750405263555192208913371509621178676044203357752939238134233705209988483613418357068790410292407284985250078216801955681819735640889915286539424767699291558260497936451862444377162411777198512727507682930531190062304184267580007068243872442587201835784461931300341180739516168341521559240873860541511979663086972805839349071094889623734952370289999461430319855751397225742175395567834824532612348799185498233668108399584932908791423527338415192594890797161640870428514483903241405192766090688820461474694129483396941450655378070502596902012960005925071407505634409039374591587356995126256441595045666991786542475413106212634440243252914105680546441834800933952893940680530366893360583164583102871341878638954296317852245050855362654227742890577697939811035528084823005072060163844309859018655879693761266441850506107247499887845837529072734963012358189223535309540488630641402694119285809766132525455640455074277103890569921925511571780900429074779519535887352143224202076526307608773803900609314478528807884041223459718478713147780482731067298371645459172074879456665672144659257063151846218815521853521538039105580092129093604550652176702149722267464711925176295825259195451897982973468788292910834248649486634164719847512355589622486356044931885992391641340252366296529307289311708336501951699737694422661506981734291820308445302217945166uwb;
+constexpr unsigned _BitInt(65472) b = 100114717733501279047723776182956757115347721138729600912473525092734313193742682589293676348980090646698499578185617585517470684073352391831549464003765330477102561187757762352331821624084183379691781020398833769817312236580255374406710448238653215266366011299735448468233210044198074360279493272538045406557958991166999429636554253642483353287723736626614076173774389030939047034368309416169925794676390609697640839419284172923106398747822703250993067360914782537098910254695325663386815684191492860666091783967519578790679002244952830877932146242740101430274624860813733813737621518346385654857238660113122429104843905171306980734661172930679373474815865977649539832219611124478579695954630737663119194766666017364148266829323683991092607661278489224151059990583807281880150958519699211512206729907482237561220086387258275529362147029865909521016312742478755489179294243171430093282806931016966661559517454422004572379224590073716192247703943965356759520307382733944577073741111865259059837853430666432946454201096800841338436696525366648645617275032528104274255720436655975433320265726343790016529230948964521731256685630816133432097823288170038731302362863259092166866670795290976986882930506509405859592561888953891642540736219655036807263131586242300902324923629589408158902044606269590852501824083407977953169790880420387424165701539966258248590181838302042657242716350701981682380948097800014578392460910606462228574932950529247423845880444246962732820595796167829328780390088984547261952625922193139901916610229492861661092747721202750340704955733954501284774742095963348761398081653664038221128605707314601000137489677301442099842048911700061503791803955912831122268287304609148464318114946033067997411760446328269899089629818950408698728257794167574666280106889646797554422339012444675121187904191185708967722514510225266384207784173261118827990431209523939503888139578140495778237116859508769743682297748273388288638161363038211171042178345297734400961512771146499751650577019484918426210881233862902133150779088536308917675675720023126726569989263142413036511588884004219336934144457874722017065088307033502514199354766651530451205664583289757274081662413150880987330091133750067230834920533743728975055389263344730948669540035822680101190222573346417237717427750191394457814210342687726766498000013848036213470001824806523810390917676635462226134191850956214698938594038260119823563852944477412377714414327252439758780753934063615870937408624486637799147159598040393215327215307442605340117246025800399858556963142978679611972248396221700503403804080352829695144629372961722182429873697110904758384111265071905568036182549343701666549957834011325475822990799454716096746337639631671775884490360422243011601189186004955027306894976823561765501914858039133459964203906905395236286543557370732592582545923702706082388298981292440554326523141412191768888786774985354560225477275159056876962270986375173181799087865790243219120768156514753058075378804237121387244965229365089782719136044346354639742868457547718684681095030552362332018190999849681495887592146220633962494400153448731724916345133363187176014861754666835819786079622711131515095142110819477599733946526083895839602442738520215405610661155875963333902646752869321042183314833848600425342924029514402024057940515954560414087254132638206655542732916298810645354416986968872665347028969439469342892109369274868458350967335118125301472432660404078835720635929784538443336511239984968501806047941832562031327607795893386746691225953383835234381573194967235635474643094918398517417264166921806441528288088045443402355878723816094922844956240649972407815453434139893648396173056349465887442386211214383750279215239460582299014299785457774615881718062010290696199591746236715232317901166371136396637267613309688712874953346067259350936395868267524609507790518269395096951214637354016666487972149783655980128430859771990004203501929484787778444457578683004883770156322092059077341536722349032536972114257275616406902699749709996773603933319820907854024772479536315883844669093925821283494708645822008101810820783195140641716134000243606844133608185824332332112983249839927840564670970228432433825221961975915060990749635049584212248419151095056965424787975733630152111814352148292787134970830277961594621197535656320334231667471538323175715856706330175623720414446772642564136630153700983082843271476124222334675026760575553850016767126350165338075849886189816039085512959708505905638997418660622260834740918236636522752771425143415253634469316035769539924429279861161253628051885191242039194300643294989477525263496369270524045342208132906359550473104053196559789720930488483001375834491004104923938881376193746134243314219738399375604805971031464688704734674695095464521297128496245034914707312779753888535864711266092705548466197291426535574121014893754119787123401584971937623911931812654824764450770311232342468580959470259239272655961272418899162587910421611618524261985997750542021074779455005156374688740346435734305248614024687700564612552105741190172364625951503127677278930753915708544368773914098299676590937380612660233945555661226552469943730447311202454996701689733595767235544191018887562427221716057081123244243028862206939620020318416338019272030222673535761415091243824899344220213821826909682871717155546406870595084403092112870623574388474066476479073028727456441291272134518133325916707830017953156301354073289349821072945405562455412800081903376134990084929058222810213923609047100884815489976321023259522929519598262743943702392819103090239344152227378627363985053187604499448761547106356313981994575416149460255944497986615098021157845050284356535450362706248417187285042024526055312009264065881371591682354632169802604427262083598208582250627831915427796250182367158626300599669694399212026109416298724633822409185174039235022054762927142269080686246280318930901190980203350485911624668496546994063270528145522420719526397809989544695566596843503482731492596788167816454610363907131928062248472260573041500893166062965788856187295498704098181866189125137557826948675639600493354685969266855297623794567974488898523037472688252341617982295015392873790962088664497225378086193671544310879669838785972260142903223019927245095777580844549010638884104639769209200307665477604099091055300078270362519111246477993239904430731996922462686314752826464505758784039999666723171757625919453065906122811537251305497217011514737417177213763214593764067148752664422948146012328519731290903790308244098558969854469190904931282697255521655384538710810480303644586476374058540600441774912294572534545156636426733874536036390499586116578633893608943483320624970331502526937331033083364637213706286447812835438610194090360193847259865214797296133832566181311155776439894102392354820221013003611344028693316135266795276622685748215557346584596407856198349627245526002613343566627596047387566650205245868910425334754220122268774663499153322547243446655200236971477227286808325849832329977668989025155615690655734958700121049678314259880433274516941313740368448978067012564933495679614199825637910516781569579160199155830560560663296421354578510594442512499287195379579324268336277361316360091572843798014638962194213012716269698822468758597878300311133823629949061897664125640932351032054366829396551968251203900849671044358851282172072240838258098943272016433083629163897124597784224520933090413533316056993226180858350563044320086941399011552412354674055795214366172709489622353743902709646842353766918728049574079852658490598896856958726564654660876677816188904983204056956942298316286809628666323111074302026916737650913945951936978318198610882687109809391228261776993442552568856842086299985121528354577358120371573210058546210995628721410485136914205561775507634402830126625053092970550420925253966720424893740053664461273292615578752444089726419732641032393726962665264685116944689079236432992916339791133475201077494716024783727266793965971604306316367909477592552189739623599529386835978606414089208119364638444853003163517130387228434899052185263668016274079598175225418161791242022435714069120445212082926181940570850484426182339526458978818065903060378711467088311585645898741729961699239471682144702568103870842720702216669402680860278635845362230434066427869144231859159759262986955826439936615791274907168968855242256254901343070736749858025412302901760189775358581743472761836453826171858917032848455752485761908759016583296522483675389396824066404514507722330609652952992678075474567391657410046141256707906965286740038798179153617510590571459571689682189325317814200862825413367798753685167097440125704909594308609543703230902994867544547366610907020718715679465856749627217752722956021023792719375618949257949318029551471406463237279097386053256458106165784402814718586954320968953015232944232114555091481218513505878811187031325189438715890314846003392759822391815907593357151854176896718800458712776231550840392562528165573689669173641314877886854023490372744509901335180787696294817330796161905970053394112525443907867607433668652883386258677820962996685886115562854075574339741971216719661373828156559780529282458735911459494401559489864284887812419236439545341876135885651429400013372301583238860904028454489524708142722596306803949054854566597158217957039081871297261584604777835589339080130753277065539224637472918767946085816057384570763125621400591796712807858659361014495937425718482510759878432518805178469184911397470582102792186717135199970992054685542479985782231415083443247072002183081558412170430706150181461932786174632200040060486620130556082725775550597153503886491716273765811783242898035508062776289388360315897493848644783580401671326513023177609545661175067468865231253962607714995209579233510463800213895037006685022727111530678946960647569492041994611577889289214604187003067493607014843594375259767009393325507098249374731201260534197847535675315091627936145725445474417647007077970651601013669120244089638820059008184479526915272546451238701529388378073107543820882471482601307693781755204293593645053848731941506801855573871644105106448156348632476694394590996668647499759732769324337813750839939368228482585677866822996075808897285141101045024299327172559063303643204635678891840174765990600105457475619319212057398172536274173734952573235629349657388284834808930989298181672653013231489218326906675692420865138508313678035493530650052541000425980302390672463045262535367221549932356256061179214984213805565772817169806741774108671645134326581312200396561492691232279136954082549326553800132522590765092700931199260885443006495417472683709218836347889341416556713960955521447189825173045189970496783139865264307350984445082592658446239587119944913051760181394482956533054827091401320864009373362414310884501656463755878688896941858827644902208323530519392191134363209222093605875804363615582532971999495724877910275024940970123598634267867983449057004158327626031855161673492950985924797420926140300957443148635248305948119123302159711096542342778234754508269492333008731157030461874784024110145169185011713946906205781125735443682935337828885687738693695435870270328989801090441996815657595446621053110705087986014161869591796501434716102994924894262460919853691777292604060667837892304215870967163298790188945493292708730676014635415208899184754264208175638073501979475201586463232950692133256168040865636663291310390611433019671304871706407766956219378791473587162260146941132518775127141191761778833574287972156449744699932079204525128341757126237578255202780294168272384946263960753848846747580898152471820579481210461228692617403001743334010595558586720070582170906860414819065030941686631580882169249479850751852749787576392806501914519459448284809198919325234555597962666877036528108982758949155823331707970649668751754759983077311413542378611369389126365438077851402102549924054446450867994447577497552929123805136418269089766743806652808714281299047085598636180446664259081645302803118870447938332134726962881831933268902895367605961305654742682557681942595468692376585710407167969955445144928854325958455185640902877281897527515272503957173916752368702422657830194930248690788806072926150700257030088973552028794286919001287564467565169267168276360307868896645323350741447653902093097675109639470686554558522889261292506848863285598285129339004052668107076800113176815163961345570041567054146209333141463996135121987937345779668356356471788538881904369947412786816384317275919332015924666412228298730977060742887197419749312437642373180122106860788033207555416255486970093794393249658029678141106618618752418344530675496475112902295282960974467835305345646815993451293962483421933603619298443409212189067242142672046810985939654246095575583636106034886704865149056128346328530869795152065794354344104033444822747517762489977160553533001635374459413235293846801145574868600827903435057462223232011527715971681357193578475384189501097323708718043676013057635619753633401699987433242030567257829524648984042297522741836915148469698960760620579836938105975423987551338694880562104981961592402605868387046713636135146255490090587713657063013206834342169765207057771395817575151173639060049201698656201765881257687504060150982128733838563049796034023876840614011963572189314715848275504480094908212911727151682350972478265191507531831250489123983022266437313653926683050158462511188241809958130049339770427565160413835574135986323510291513545862418063205074338951079462206513685443145029864073921345021844849145745506162062728038266780249818625325662039340090237496340119475614453071232421297080815361765917150654498069903376867748062701336517275461202624748253020697726500031864664945001245111844270693804633948293660956787843373851845741902131555575197437478354614572541194422782602417058105318480168246799662377801538412314782958545171511894127231938686814207967909824118678903423512091452330938797960128910415335081862651960856032734835329855407218637980418358390956784239363890984656439527356282433324733832160603920004248721726338683836656033047419137225415292066170285984893661640083871544720413189611564145203928377134969949548474888762163068000397757655287195739651812759315723556948579434454669396632037129299024150872401801117369941615583644974876856502199207175387556416641512503041635774749314746591155833739783123080261110094782076209478201554818723446968836641113221564050283245191877862533711084428640130864488454624802680743072975620306310112619729211333069104357243325018778925520339061944098628465362651206617075002416048055795473391492434363052025347266378809851694299889317222370569013832244994643866409070049045118774933868368384603258635939615603091148804570884962661244438865936067471893668250308842566762788319411539561490781503763155653479460134043895532426945156128934612696025828504252151283375134510928459903096734715153778109403130197131248019316651759693973872674955733275103421982376252787312385797658220770598275965146003356181856999908947864770076708535586349492850757899232423143844396084844040078005090221296054651028866997635940904155999427038747919225619740701123163061243671120415487124489411500715828191499601409291460757889380695691474308683189522903077241070380367089132643611650523307834742745303310487887966951497117510647349374273456397897912211757807464869034382068316034160043853449543591014954136582441662095506858285864781585065293658602509060854597649067616795737812231598010734067941421565684420201992773835623036204418104877305471742752109397920380834966996710722028819710035428614600730086831596971100231590883989944752546536016172546412684040033559521236967246214853735645413254299253410727690575867954214416140558081346451163964108762439427323970051606289776165858416424357891422467181650062684992877166286740589476752703701626528952288163423007889277331352674140021142845910516076662232216674718029398638715878974237152069137050755428155130793640662166117584202466608262987553732524714724388803300488229233044845668887800816824438968080839216969181219448044547443941051929925417699822554422881421994087240655174880773473548911756902998184900735695948490729748321004382279340016278094703572364133125564281642719607796887756471802835333379278409552784648073731419635698518935992786120804917676305536605060009182587611523462994989304451899943175196266152948994385451605471158595872957687826054582153472712542715255302609621888638651371697502021672915772676513343000790978308183287967785349465835917873022653042349856876549193764678016698233332898698798473764345254002662653507564038184374035002721176644511741088639865091304530245168267837700955655779122874902659518767696535040199203301461538774050612808685039502336859677745894076135500061581363176842799625473551806048893186087740946866607450388261315547482318656946969696550662834005919348568293728751372059746250342038728413637702999453641030986923514088735238246185727389302501769068311178111654423584088243660081820882572402391549407625437880913790459621072887481182872099914351803243142744092107764205010581529784581053259035664288135974399803998383643582622960285003661540002883844783064606262959936669169329402394659415036846067768525715376351716220490464406707920642698245918808294529084826031771071469485012891059110411484906779808870511481508634839218367918630524749909869651924155084608745088196942032592596539527999961140782450000510003527503750358791029922462482173677027356392350857214893824774827323978108285364541487637924703438313854030156086904163066939454891376856614795154679714792914673806642019152560027271392215087552179465448818060415061519146801092421368810715449187690775243640394007336532567401444394739650896078150242023594790877415956923548671954483306470894638272194818356709172236128340332770207851698971571587319010792604461565714677618438475569161104417573197556864349189146849724838083993133408251465883761728542325249315486515628013094801050375617956346751016492408161056634016092819014841853897267006965481937343839268114290444523549214856748090163208413527478840072549345380110648262081120319520850811775071545119935961470512637911989177087460006474693931889487742359706755672077087166572689858419021851837802780193208434024282299532942483000144195002022520619980583220590077215711664509153314666589125687826629822516884195708377252997538578332258307932873989956586374981442291372854468403699025042572235856717915388770530168587331179797655658071103524008115236353756549679170748759469516067942438616716357831153014255228670162534958193004943600542870528708805213389429304896418304635289448124302710129897769356418770523480407389315328572306634238009504382082021165613590522029840102543328930669970500692456407511650187852937349195602608014357736751059571489603216826077415809980979995711283335891962795940179019435439507734122753192445481086439094633796179207995025246597613838245829524552778303821902522279173224245471199657550553825642492239342948135017794983743597654410313919346933663867165680179522453998439173845369808176275332816850180170341213378782496307778975588398912577730974746618617131469815557973549303574003815147711173642475398410677966310429335960283636647175743582296638000833820970775030964223374636373803454955444189296936840037446363760362609968685074787335071844649451957697708868264272628943789964979104588674822545864503338181273898348523408711384734508949115868795361526655558615590780941372174574518038087185667131948876078387967198148041613418973289441521934658231375183374956575695869332017751718627982355393837019680653556985919193671847767127134568298291883035015093292336382067308787956277908453081687665703784475018000718697708635284076006695671158759597412687872005027545848711100708185954993889142620615392711359879239101030375288401894286247542619281771596083146956639572008458511055345530112400412859347687uwb;
+constexpr unsigned _BitInt(65472) c = a + b;
+constexpr unsigned _BitInt(65472) d = 65733310712974309367288359480609626206791873887406120614733566482989916799556257112216000049296191860946928376952770914306941899605485940771755684540650442628048273063270873248514555210034196075561139066045840499492361498226073231697006377971536721223952154393046315830776038940449691541319740696961883087824017261681376524927620653768554379673373641639381277483868891587662001863419124871001009079537921523665768337716200951896815969924745929795329212934170312485558464946777503351275156853431957611568920789844552631853447610968920496077738692498000533852760507563967103841050666987732076030100597343456816635403239960433806006856418152716540091693637161283246177641292173543574512366902095853676443736576147420571058987232518265841796862433718664274349920633906531393769642675525093914711153973922447983137836456165193697235052551805400298086748645418276187545002106540916940395119175073042452237626925202060310568697433598981090347253584305512444157902701459227814962188102586948892109610299149051502729974628908609809839821822668130317727334441794910982323288113687167417312366330251518202778678924819655933549572677766276304430538124570465930158881124158535793551498860046868088427643048679300639925301593466769812387105615012578877880942705932034097020799850477256554157187520410799244192086355131496764490623151239802453953907987512129264476529989486245112709372298713617598130001106466276409258479134275433778100370825627338116103346660142744281838852332284703873115994712754322103199482327643844821444620969063070231305099748945990177354116563708994207860979807869487982086908579214553457839339156863236498493901872308526293149758602972887939740766581996707422324863902544850256976660695255552868047320215405536704136182963653688512530881389442673688153779168928135272667235282714117619186610756449017782957105316404901015149425682458716235839749012551636965653227602758151742238268928989092641393035117605197064846256509919642113594994851398265224351584646864671276272287170206350834967382210977603114637135024583665957926257686586058765810879630550155133497957679518697701224201347673784813556755516652278639222049628628287667613121004050120363396228919211550751644909908584892325419054798571690630781528920127106892476546223788400087450236632648353332805463973464740030783584597992338831046583674519869603805425373352565430767940512477204822377530625570185248046102607943687326859064835877026768109497540886942682684799854161862922119146249366591746206428593130174782303743654861025754940013540275960320712831588609903301287960684961185629000492377328684361400422413202934931928128205758977693042413470979440630546227978341467432196713936659890524636113664916651345905532522446273701858583186487486581241346946982996651940112810669464052280768863401797902429886586329492435603149059738096812614308552041610545962554732460517382302778704900314853378833994526492859340082586070061874180401035531072947356120533223330596236951819458671353284610290902367114339230130038474653060194134173441865231113369348953652356888429945225573297968120204809079466443965769374017835395355023768612500042930682981458036210757904433118080252226763196336174038015538916025253047465327780663745316284042180589950637410910243796722176452997422452032869849474155801562587406994494338806397698857919192253297500493784346639226164158567706153672447576854501508656642416319546327503355101617552858712404139385302095053298974831170533510055418735231163952891673278446632404352251926633418293917756851159977649745652219261347400777288096237796987996178292518234769055437767785281299929461975823205145570766477071025158470557503539318620163226935642230750325519351407338671881791777421947266477128840544205744167421398368196045974760281477844909410435155086523641006217202968340148903733166861610745128566882125063104438505676019473865622707492473021438332405640370508995585435065934252616730287190014082490179349579155878175673090202058578789470739947139150638934038138854860659580737294427346084473515761085656374694303240034849377638603819627901691746584454737075987696732357864160392684097734196506903951030340568566210073938545020734774672539136441431596494399821760599541801790002315717000790501618766726270055259571145436819102070077096893640498510170082736898801319866580232219628192859326134644962295862962394503244378790497751333374799637180562971292630390152275444702790253729069919721990668632055229811455885739489565076520257982326323875516272981848548514646158679361508148923561357778035888502051861007880479204011110486245574869858472137738300810270139435935840928373836784477996558084637636599118320399137586018170765778543561772852108460779850111484532178560301608530586242255218170413391235975404124813248921038023968124539591162200254492538477883460799401251722230389152830685780062770735001129218658225402145869689445329832076158865544012546385379952350848071363447689084299437128393129712854269186158884623440785080127828567674142955139977142314173327744101769578385949887626225232567431292464838177881053175933182795610276528165039456432713744227820265347923797672998924525666844096977943611539498280790283718695987111890972309916548512146602693673585809451569438925252460399015606252694572451638647723983860176322391824411594587395886929378769888525765272903804387296530026060315134144616825034150473979181473433350930826379704943481916964116513350250938678585295189807690963814876673299057200601671473184784764308134823451386765389454409346892892074774191075512646614701216770972610868772288229260369238970314495042811553164842978580655316213597939013907486910566989281674324160240738064996765996237332550300274306784336662255839815949109702299743980927123146425097820892903672153196408370662800689888188019379058741285331097301245972926112276153227947559985943546686506638810613424903193542704460404171589584398190245989640779754495625561723849214983737287782842000135718896989752537689864067398378213687459242441194971923220481541558570562442595085851041944799808904544506901571173692831540551165995774595397470400090562683562794797697451285136828058143410591944789180427904555456236941912215085454981071205525291216441004333912838320426472156279271774015558431587150544806781108944739721492705508709807242677552414468497054010543374648176577420059610855075742038369243252137693046107454287811873987736356821716492639864472332281808643883488191858800704652514964663233933121073957190441066389920544329130284858672534099201695727803342839514123378350647709393690280907650354940575107480283474589624431744112216519223017797921728614302139082329594274840140955169096182323453926257960018135659648490966464611127419651150020298022851672795958613733226054374082818376066733051312368282035038368221284863628439006578385553557427882694598740435172636552554976931016786384269073745219783967315992539194327913100155235209949808181873346418916844796192276741603170233235579826937741291735884125962583664120694650682226451066086977052680862907173073986350090415076972216568662204777477676181236054073998491942400434664408501191792680685898213614962161129478516160664228754814099785893942104387816797251376921851749252728130118789568732271069448494645703579466004131124122290810249141494796253053995420122535297581983215063363025637799574748502335575866748531406891315967131854482010827928515900145183933802038759837780856621841566650201051974277965566300742851625735938106960447092085629446949143070976802036257426890656404430664365438022478767335206522837018867309001375559793404871129404322039002227149686606800054203400638173907211138919574969418122927785423106047254614638512456220433124655851487811812724404028021271603490636522676990657913071077769637444715725031465662119446538311847732751542465191912628172838715204335863864671263320123569607180813744039784794557850275817793745624539689727591059618207995917822692190607371341378619667008166326946823971150816170122919732927420005317989039847266860660838953010552852504872862201752813773661634566079866536422711701242406591907899014311859857561282458525992977344795421368705765423491900494672782609071622856881671225075228441073660291043270090532848717852955586557701097116656191206054810390050048974711729417972730695253698922905903402839461448947122909788437632918839109833855362870382021199337984636024211238445100119626506381001969142602820463906490830595091014587141363784712274529031186275532698542639030690737659655600732970978851629312632137955400109789124977675620891004796030561742309942982748726372788787844021365802206904154115828668469270647299065970892497506111177532779559235107495836644954860706519473738135333950676031184011334131153827391679043933870226065555817120578169594750859481964131203848536656321857915857019373230113604751095011430181838849196745919952458747873798651717228532368461626109205523225639696330985887543329702480065069798021969676105832222945278141918785180882254250181098714406914257413016773369311869929152473125037538836513147242640209270244621659867009280097881063095471227753857143377601538041908750720006209690876181941021293642811986890202282804923829454634304181075900728613236664383586413616441697962542689578964065923089817733799825401573631814041866188341822243904759333927889104250345822671803414434105208744186155926365676023108882730907733416174548842904738098597990054889857381759390405485985518292115964818019271139283111127144800517769797473685025967075941449741615153698181505476810210967212803156816435231005673110423674513460636903668571824788159266787950485643661101097519027767227755811167539723858541445903613867046027425790261586364576421346937949718637662093121876664211260659292665449453080467223969221541179031478839642011093187558574762424999953052269680026408388999894170108416916532370159310822306602527242241530469492050287644560390277163182566803384323647099694707514050241865025172990171732605422101252357761063125476145746508991853078042922923153532784863325897244500645080149943359682263761150491526758875442985583552806808448629787995518297967314995455444994379911835022316562927851501506714648033621987766605002273618805427820725655255977374251338915726717301436930699540753512270795587456559247324929358179682063943525930291478512399288175042909536775369829505534083212059067254922352369906115992953239868481254701706434450589968175259925224821181704186062671131863272203667288350609487644222219885266990254704667818169376769155049017443906498172414816916890099409769355698701114433211583133920680556670543334803812761075853503926979327958677028267011586824680244161797749063673065254240231260361482750693784287853381848065660924686459034669880024581940263665796227271840581998890059322321592914679410594646741924022734402967264922935666215241807910570827221059060464009439431848275172279807341660871539626899936734487126312793753112535721604037917984956372984344255463503171438382469687784808103212516696656465863764872965099254615613949298313368151770793885032085655010703699302801830837233905991992846971231980083357412443374790849451715248332001200446408954911292590345506980059689220419521622573695142800778196641963819347779781464898335945168142382288667603631444785921490519524557942964428371858887048557762883101800114636975374788847139768098532708794734963700051171553605854224738749839228186541203233478952754225649056732496723537224770787140204485344097694581527085745724073853845931749145068705119355469706666814377304194353069473678901721251998125134277321554040010085443433214437095962138168614846132092960249532502790475660773357322473456633740763590177329302651667558515902026192312270713340464664559379349881654479834848594990705911609377850540465814247981868919471088482610181053279395956541668167109033136996544482455304496236470853311516882696402592860776402528524418974654229171819383398946865904742803905698663793581648361428196179753345853333461596621837135825352632730141555838702201751706912055431454254203634774237836923223909207131773115474932364730163918580203711140938921645842472562399715122364324743113226904203354131670331853202038093577891624766074225030436696861691740417975054973861487048797975263899852389518576215977484746081088024774051070273517721500772048423662760209959853087623187023361223489991661522345358861206297468468414945784260252914834291908620955283686325996635431556840870693679743205870610728458779027093769106719141828673885454104445364754600645382978058882615962053396551668687164543905638237796969580255230943486680489869121332795004537548997958551443130441850722739586205099809291944934718981644248935989484265304140216346392928217091155186286727301198704575313127693210570021741771212340344380118361755793120626113896692172192970189671397465989966599783019340692909894111707602644029868632108619976201596557347762747397731091893518315505744672739581394668327454739383784324388450118021530254822019582999210141345431573532702238498543425906437633146511039286213901077094205025792484777193934176232100087114080513255075225408076979438243093213287700754638428973401727568608105385331184818413415120264785903581965112782059251324887970218309029080956611905522342577055153160171391832815735671709202835679972770969092038116768344576380562579680049697638639253099672180524573592630287801479783485556178767876566817915901890128280355298145494997577366648043196995306380682131376412607852915782853539523955091939553876816718814425681881438067157998112338527064687494784079462240951494355318688764824947876348896064548609507089718328708924674408381256787459001120621378520391261981333895190200338539428045048703611100501650848998205563213020524635315289615363581537690207298649864096548701931841128460211285121616079194250546369128047149913251323864985018928671318833677490034910282824468791738951513347250937598596971700525262274478694023742540145205474422785034665365205356639213190996217496924563848079577314325157667502656165232690283638427361378701996292077524391724943161508199500251567352164469451944314191201830196953638296355281391315214165221286987409934439741065567042555182155219977334605117051211162008552050535337492427253161086619689944865514767300074434538675912676999280216534587905627238194494953260482940568293400188546300502051046396999957249695964663901363407706222747131851011821193811243337366829604875455415851595817936629351826829550581136476539437795010218682911765844577711253228470671618789932794676490380865767038712588269058013669058792562996005423843803791484387085411898630625696125013546418161882721396452684841294493269501195578664340234891466164269467677385637878034293455809942446434225495352332378954730697473949178984606491568133276987301905841355297400053577386173285186611377447749125561813289416475082718496432897380687562954485268216052656604982175166636595368316816184037417869395475854625707060812970045553255755682765008637058611255039007981700581445526495567716561151398679279392913224930984914722746088712741496204641145240343337267832439894946010794902149269327815030140928095537137424419469957191747582125977373974416010362400064662058205735068506653620358020091594077058093709563305635394365888951703713886687815595672975687836297163978303414380398340196256886843057145148086253019606251959176012736523050890982883167224531493046576153166202984754911330805302122877672209304137806534926332672030280601402371820660980715756316306971938426266364136014397755163537944436183306688557521149071947401065246665374314986299514968125105349134395472939146400860609598580135850530756353052531369089611571602009716057411639240365265231216993694267378520425490736310164525367262982354745486129744345588532922894054353037220470375493150439381833056944970888892616077309777316341795883468143310146239393066796540157579427902905105575396180637339329822962351442704693893990585295012177749307785629674984186894084722849823467988780664750679693559534625774528522993488647132027746755993238476030751014405149653809180905004415744676550311221411267308377184686844986249007487478788508392782538891486397947112704910062977888061362065836091013302863155856965856096726458793923914795360061925584765206205171434756224518649718609198278686690570114973663391681083900561300317422032763346383056548744255119690201692499045660273674439968025877769274188305281955507982278844512623391355402464120401117148098511029898954726889232385151020303726506197952516637537419684727644750222404041929736512483497879491116484463259316053640341152264383400828860691401749104231010185274773199703770494291362248430735093171883754998640079602962659079040079351016071711191111680144191437902886226218542004288118985273592852073561277359495283785012899821803960056421709438351766076034988885713762994657577069723317148951070302272223238754526260227628439170238797495573897162559693676180431590127915391824013774025745344743489766655187683613196825687939071892559395878482535957800662063722765871480796050452363686958159805963927717718040700130441332294899530200297519615070767447460875457173269654053182266680123894729972709573570698706627270034433323209929097134664823788484666779312590125436798445066410155762650942485034997893787224028460212608271409888891101832339701067151190376431210470677697853810239905340357318543088596033437087441047744357222850669065868528446046740410109557825052671697608704008115043754427611790290802442242197178818583202461150101668283595827485977845284539626583718745260600144453281308210442940609691638369829825393954583995698366266720158971927855718008153570289419638691055692609193578393304832631971933511941336873679108394602640602562097556694144199408702985966498710717489164632640898761368752687108705140589757820237281212812473653136623398287806799099262908394484009109400779936356676886679972945728534689830084292420337733083763707387359460107302890472955054186957291401602261166979427665022210699225524810990904147722777293253830299043537994818526494128605925817350925088323444808096338513145738279696564731850349272008307820505114672631691086424540539543915924116257585875165597466373117844714254711574026661223440392924078451616713051920432311403871515113100518727577685639388320691776988175874708086550198109171131010071911106276959402931457385608422763988528718814476397814403552115457745096413840806325350585181288716521662012116913089656556297188715085982902221449994681630218437964936442320787391478216687908217903058261221128100585640757158282791292148088017396304829182083856116576696914842166432097920147620232111356401551165153489559661815514199982279638812679376483348319464548905923211042034064419484777348455290858798391526838102301379345168508032358556333110301315859339863690258679059572710256382248585394483092186058190443279674645328249674038450532729040355220463492502022446815663125456493901673386199636489640049010666677368429631921384546418957523730405383304428565397535515818187652093874534484245027771357268667721098366735200537472441216821380420620954504368236682393275855126238039776198621321282477911713680118719544465367875016153686707320695964258722040822975809759593976906308805244188511548948755947543912746457738061565530716519713167241081134918501973826739021484172593069513499777141328929736443889220619862691489015649243210929597568564547430948813132671040781638452369284835944133923240780767953175287558722117901106695398470566569210207177272401106331295413031614114233240842652452039520120577789477112213113151681038394702186301416182218247167584374421196913821288796001954550153326787772982152472873940191552643973037381956032576392763553240937704068420072583921057053471467372933417647188614551861876072347018962154219975121743480241605411751024300986478918975618499472073146934217998545512642937199165055642656035521248653183517787719217771774678113026792233128320134509150459329079579221641634322619683342322639111798635465124959513826815422uwb;
+constexpr unsigned _BitInt(65472) e = d / 71uwb;
+constexpr unsigned _BitInt(65472) f = 81119048438667678167087681061547454956381140139384237245583550530711468333938645409844208679849133854327057611553489468128164328035984847463655845071788960362320831883540865379868695908177633856753875928042242813143759736902234615262784603349439052388136548958388122154196710982058319581972751161275633244818776656878408368619251890145307362029151951656665307449952950058545413678359706906934219861128762057927752878526888300707475052550567207218048464686590414329826011899493877618251612171176743649929542208704371790742051581061564924686728630317826783167436874223826889941491613321988011685915234856911937130079954611950479372405086492241563823732858570387693419963851277511423963831485548548300094183848777598065592477874361374791093134495858258772895350156173763904460587088304626080634782396169079853496729981933220728341579433292565018270340924969893176586137517212163566854668149084854194514540512972367539162773979546948405367825368816551439864599197623727447961973313852940189734097264773581223296564673086780437949527333234617991653039436427470089995629538677536322616344087013847245825889785129307101277587565790413807740056128153459347496379119475908790478674607311021353394024326546901226384866292029804856762549998378275395607862546028767887582384886893835304122473034112598555482961034975502226294476263955953414070184072692312251960704831523959513116199602910182193757720818611785611751424872435670755617225210397949250736289480496031229147785822280915073807228690260594124922546495633080711556467302590257107613805828154894362406553065122318032375945758669501668531919640242996141135537856152350704071206074158995802163298941744429285664265346600664813581320330085506182810969682362910556467384482527355881041049958578983724682270051978097497573988595202306543328228899366535303141001836130010179223955484310671691315675157890298161246314699906091629686102037118090687227643323983661402317966793329148608990208151816103891551217336257589721797279511678677607962987465599398444346206660607675612669385133994339334001047202637207070158304634164621649018083846364972854840542085445503273185398635963127539412104744443236732256410064386842938897180293501132242767965433327446407714979432067107304996848947553965459312857290102292633778071925103855561961642689712171066326296310751014912350815838229102059282801001807007546862384852431170548875729913417313449317847846268130604437245222947026237046389351718642033347919557634869689872939487994497721319996121053479869301217891602001377463819348096214595761560042060467757505786280651084681880163047905225772849072707850057452565822401181498495553368995371572225391463960379328369998850781937151047607536666997565456244697610971794918121724255472143489722289853957819365396078455701339705550882833666248654901691646941516172619659758623700966761264487839045597711090111609043113466081404797094428834184000722494962361259142927215260652320646674302376291741333046218753795318533934134259021690347497655704386411615592650870422342229618987816769323769256274950493247725841212690242938711616060178642536645581037848024744067722023890268818663850692404866682718757177280591339061114974200127926081733733018102141027506053391371425739609259095336710641686739798192412331252101710193050506100630574040807566296147790678793092821503626466188997393185623444459684752040722703184565952637890300357344078236773703041612119688753710951737983088821404522393324152283715757727599156198283521860165529341197148175466397391445044487934307253572874211454446413378321526991472029674563296210659444945015438578433530023303317646179730757486551333547484168809553116275681543554769794852111447172464324820230195235570574101222038053231415531130403535642101014250043829312952635775623171615396151190160824468938979021996635823946530092873435448371338356467494980520678919103994679971871190574979116176861082978687034118804828671405005458967552089962593761753485765192586963197333042944108056083507875173377303275821279528360690420915103903277555517739176118062387662726531924427886263223467472756464895276108685877011617074604870503329783376466294167561256118789414043290844890467721215980924736118802611717469061553985464403283105120058553402002832205225756564480590464041062170054205408435207673717764462878667484094585324010615984002752965285598325142296404754671892624212410092915444222450922807502434260509517936530681719400385179332102078962960989053304307903630987068328941572686913884437211771806107290781422240094404517925939208619021498644747595753667530534854396116308693966724901034910333882380323105599336039992289396717523357770305965180968018091683038560418513989593671315494952005575641589066096424514272893213280807203580425404888117237642205257712307303520976480585990631493558802249597215990680727235727680464741106200457940514707243632479374697310949259806293595605426504156875265643852486131696413469651497770625614055561695520874734132569280184155330884303541927274099444596075460312500140627414316921245782551508392694567926458725922156525134131912620565629563745424477601001002834577003764301757275006572898941827383642087739961341233316802079286247050240864190436485241852367599925843222354834508189424267520537148646435669679609916702080455050518247564333696291426460728311097975896311205794873263365251428440180820526976514251965060111780918811290932324514544775320372515644899646445386297030021170451457124095843775923323648641302287349569472380872468981315675312934595215917185742254550785729284384994468474362021071156740095507340126577833882996928879297117957134110697823557811746768297256901301469847365366540872176266513666224312797304645117801470774161300769414206440106647681505178861726195178070504474193201547152440879140147395354291118092097766087707629160801177150569212616669050339675277783278561419070471509958120627858186869286180400810179621757437463950373570215026972271523776904898375864872682957691253734286904820890912266621421134519912609409321158405153278383121089931663076724394859447175761223776998781734439316313779725605736797116945518910959312627147450807693644698768186421543176062568269126135364923107771703835943600424121438954027487338321722570442329551738760412623469610835330959822855143237859319003755140931892768237651598726557124619934447707062427209188221064149521440640066748619847807496914428090027290892686426829384522012606207518375267107272024760472127103492224665241988704409301564171603029155477114602819662906864324804894233432183235006361334660519980228744254510540041914250111138836989771057454654361547808598933184456396356506645221284696351504236067684263932447980859845924807299229049024046473245673203436521710994303419754660467297271707120629690385943875053778343184455773738237881501082462953248165955808898084784475632662320255655065971913920219022035914633324174732177874088438600417796719490628693272667960011196066396582965342176994548255439142090512459388501942746352045185426148002634943204379246479992639232921830427033287155498919776545033968687621234093949952909800026995695079322733909577094852037690747955182561930828130036202145179371869408388913075896545961481134374398000320119002595527049537405648113593028246809564199535473284898041084967534286644400118310477565602342339149979928025711422687497006581756870241948832788965327620211873440249958591482493647480343674661352705657341579860982847393587969445835000305914486839931462621936881997112355704793534251184118769836474684593365406384472677451238145980115233631239247091702886622282776765570550640577164254082902084481046445184457510053388880609565532493436064593184865796251942514270217511141402543672756335480006142305884648244473831525460829363634009149069107713792592957352156655644528612153857814065482670082433717647773255802209129658062502706566850593441730666442893080895203992967625531811586694873773329205655322405359033341706687324384018317037001782168879764687102213649107684017881114046056973626288368923831980412157547214430507911000409494544506938619432275414478439064152462285377461223295418752397837436482567742872764397512131024342672507526733360260619700643186477463782694275609954903143256542952944244778121152941289179788480630575079737246115747738710731162393425436847859590748398447899233172200885163210339069282573128507741201746652410914892598843232556714867016096598036327204404859186977944018852154292950479601707726551489067324830725948985200010822771865994042549528143137537234897029439040042099258593057347700830782468002060943008703943539233162564161925283351163593564000534389587666012967529689803053042601268511160410637186606459825374862793733909559137035783365120986108633756185235286103911854615676281592264788454915332644527001118582184317205780738425507296610451103953245609660526224451952038193836909795487838919754293279246980412412277469667514578815693400872697826159671033387900060491350863625690886949607407803017489536456543547449575452205017872347883973885053031375178228655676446542688676430489905336895163589876370964053761552234596313318661762645436334322498036180731113807766213352920419109181566662246988745170550346369695736277066595184206278927540272175689860604339875001317571632108033143340510285476759986347610209603646730491066476518327502915964009738773437390713106897658049079921025910397086352600630140473861970059325940882198708598301803793063240941226649048055739602475710328647679371343726914399933927294112748415016048578310432314612655800678443667961781718967749656812897847657802967169299415131554072494120795622870359923856891605071616981039858332959855369188625993550681663399570012356032290795384164356201731128172530583544055446571588461496057995980051362265047609949782134422377992955289114641410000667908324797515059271430856942076440404106883511530427157381337099588682150941240363697805807280391816158778238762289070818367605192052103908830159642096297615269980255859671250200610730249344137390151207031035250558274035825002195793610549381991958431852387163377257799558681814523416557997072060034383107573558276040572471843576830621389193860813697602418293653386506782212076337399903209307214470100317235761412805710850988359248318598165462604247385873981751694346718728457417932324818612380916204158539792578806888256805126676518435457076849655151856936357948664784020095496222964185430323976361450038602411831033143981782139688999603806697895951064824131960093159480868343924057343826438855010476119767439348362410237725083120920471869889013959103517616051537640818148924738754354089158457115165537078046425536848814772861455928301259776462563365625720593811805541433460027991668477245734380834490979189946819375364265114193907530843496079499570606407645546816451989380123450283611889376947411971083006967171854331483582409116300864741032958931152422255907229272782370063366185455785561463140714434020616892321571308397688561765568218590094663388920474697495754115827676909301461896579867695100028699940482746731097861581511867012590301918904848423473482044669126212681353219369262557674792141559042307781925390412160830618045086937241164165649447650723634354457142234648420469253813076126735987958558693703224345904768090230475931054961533525465895971268945384947233816059121648653851353453912800961632935932861729834819069634919635535224730153324057833673435077653698129140436860433080504229548612604634726787499023145026639040302604734451197951750210597736330455651622023033797538538538388047038717462186292552700783681032951322029660431854988718647042310141247996594683975241674287271866496256088758252070549970212193934302912289510530303203831345332617060689084866476564117717848075568001674095145292184997435515321066836286842449524618961120843546331558247350173766825349931296560241611815167064564222077109455628613665751622910083205972562374990491989440135610674632037756035201220531489214743233527679896283445539353795937582940464566820043656823348330117257561617021315014049449950739422399371130289848322210348793026445266609167020369472192152933194603981711148733468582622132685224707344961686050084595182669371775863549703595858015823029362059923704401908771829719157180336503430116716548633754689680081817505016700333755593763797689012292844579379020029127375863019884877689032184615650546270273754978419500607831225684508776090376013315145720095774198145351621403429352951733285655442381483133062462448870877207237218277952979379182757247788452029508696570488503322564296655547291293159396498587812247048810855422075907102519074830482119974646632454684466511785100872254577824923892646219715283408023229043837722903387825185619904121450017633423962806734053983934885694936245030629211896809296229178870359102587984788832764476132123860284993319553254333377839285141565016492722252221500663685398500037288543684486768039325272434073801963463430942131045379202104691431436998216258579637703636865411008126921082151389068001167345018683753020006635937917955530346905162334685025167618679504177188090790942946213285536894146220921886876894907949473675184610288598142017504617242654104935121705029703374353045210887017164061794037910162870959118258745823059265397125649060836584712804805218669996212063992598515582310270762188378921310553219011284838436786157288363931529250206667998181297158027685071735143864929936838618916161453511377304799441674298890606473463305374663350676450748359348725937885062403443723509124094601154953488320671752278073393621467650971847117076922250477511784298673658861500721612064575807608998895607851644295453391456454531215271085280924936192363348006487557798534384978443971017420514310413011341257910074101557496425650045546328569522751909127274474723854148277045201115758974699352866898705983402808577306498669325143473424401614778819080047903246862154326670516656908138050620886701703196982970872862366004885871348263125410814963357269942863134475202775601444469305395643930624301668737708355311375180156253322096137444456043933566859036382939967257430039603258368723799047389083839037860709580897208871869627268202249353732838171824296209296294548516742651643397676384749036910080620422686703669742292285224805146963851250167147621958192005244523117780154638357434245675935026566469741372627933840058563022743977770039792941923366831648672050001010333404021614070168174891577961210547481087335204029860430074623406526352168871545292621654379079768226371019632197882405089965244441091504957041079111109676293226058631082853605089096750145815866278653725337363601678627338076852854131594110446067843045748196020864098897960603689048909134722146224159214858620044517227409018605296559371894118327828546734398364921268494096918767605212134173850356612880499233235875192216561439048754061975401146302507573162756351518836491904543648427377290672401377607941743202014178133247052968916763308898658059366804112593142747772802872872304011241156942330917342016664825114824131243881038959568825225716955297062560791044525662833617673328465929407476131817005115131011425346567647872751463087723497711057993035067620531694484063799218004595637121150717217183299896785562805015987083726131098938541665352678729793826691542886712254454230735695807236938891382873474309821108791807902851724497787728694301469491290361539735735734028169861741514343551497126831500670910708155930812131910887385589358355422555285375252543773821415062238769615036107116916346130894926104313380154323093641810144994084088334595459474978569275200850715028129823788422826182776550189888994189028571671614227763000320597970917330215486637825461852950012215677075728416669389817388070042483328475316537616864892173128781529114231771457379262706718258234462542374022749406522482693318623915313361505582138590475914803913584557901835727566996101504851269428252388749069741603720981968903953766184268334938276196004132962491389692548154641063031127046389922901411660834127939363774203120739133359618778189671081189918613578143635540354473049602793742448779303364071952500394469313756206252912480887419992330960013802381990210410631484072902902375998459735022573434286550488854404225499410437440899765548675353956027131753647660244719190071121180046235065381258093864329255300391061722518798465720681617948506132785891614696323904168697255418185414840320826942738182211049148991865561460552475257728514376004626739858958112783218822581938659995258008366390674024417559692051128119019755248518826335616004433962828701583475168064968287188646214245436116135742700974241192952705901357173335366072427382953649798775310169545613750921035354107237850806773170429868305977421534705142239789399817358489398528489621671100995785476142590361642167601419294639340535073524003189021567892064529154719611780384794965102877185634190417678554972476697592417945100762958234795145634183841198575605036693361890914066638688933804783122003206140851517845351284437901254259517963992132047440899338576461272921447117371152745656464026628310288885368960098096395483758646172667160452702652763728544415019742833971425823350297849878891081549376274324754320377470927375294403461571445568047178227228649780287407629716070804833784829531827100866306285704108381700908714688679792170091907185890482755056663783653285850369390801734159537296613413088952244635065103645191579854038158054805810126516527000246940559539553778892449771733156126807409645105473768008808972072008217506082220527464421397385482291529628610427697726036406268830099560882593282337035370709287350673933627663463610202838804830135576202990273111350225601975962441083015431105048646343759044877770708388334099167417362280821803262543471360466340830978889317353377750218329560019091914123445543397162385202752767669258874323919091915867230744011350323401943498133873125741935300069150865471338673218318699682037848842960704204726712036770403135645242073535305594100787208225387595470760974598941367205963787787451921872637551209837515546984033501137650105919525019782774083428947486562538308599107816386191438690298067432065274285152619455640208329873154326556265218124953422102104061164759739406020007771447449633506691053566567554794290137213551502841022803374066829191255804461926337382291971071657619740152638187836068987044078311655693090136890581847972811444227785568598697490213744389532539849062085793434364140569384991142262252002341633787983042085815862009284930092119956533000012942039931918424874436052309809612076045438352507919301315931370884026985545405614314711742990866407383288963891689191987720090661237584147466664348258734606093419545193907923873057096186600080087829790813417721075180297238453473507102656390704903022463507389818244022806666755905180037866359102638089631182462270862768787387368570734224286771986934557843667679671999977789368503351679562337657410015516370171000888537444667506161377038374275576286219252222288250058986308656559322111651560979152776988991823243693590987572629615903838137358071995845670867227876752335931359417336032690435719777074026099760429651423260611168595239702289345958194686977765546787012516833388024556329306161090878811254191812807181148398358492263376089635636576122404761772834195976106082533669359788834602183992961701195820952116398799174622232396129037427479764558336883762314935238157985291895843414254671829878324339001987738619891291427323314592666630164935825946743743891716827463547008617450634928010342360487247773526521316117380620849244670899334798193689224088577441539145108966591940250014425667966508636518668132105272814102989073304527222247595005692471942155566669672508265839552263578063972763273633393197633385588002045734487191760501135491526337629695993173298383444778411111350828500653946760200905423307420627645624295420909895627482832393225261330169329637488004609091139880602114081817083587800642684902092333638498363749375561841720781868464322821196677454133629871922182954402660834327698585486213839832288uwb;
+constexpr unsigned _BitInt(65472) g = f >> 131;
+static_assert (c == 57377170989012975523235298775628163096786299329052925173791514226739126998299132487187540275332383345633202443026572283244195003730186546233931040576254981863691366198241646738582443836938118929157834265839050149448112591983102709209299379515040179869431043477239668452738506539490676389953277690877463630052873929146723173084770756201506988565759265503385683595422822915381435833997954584133804797693715376511393546428928468053144514693805025551921210093099095632179601519025351007239644806371537347664790877994232302065208364877919439667571152385500660502806582630919320611305765872100746931444315248184766234359238222381740447636693461661322019586656052268540800014118990950583495903380068020786002928240326898431693869995996718398424733979832452475783024656559268509404424289861986444627782117438848327446464800529729964729718097296194135885144761895936794304601810062573606092269764133696154408339619752939837601410428702087613619070704348681194015486008116310922595347812974165062342557117212169975803171297939841250867923983149268543209999522465395376129489798925020742018329341237926186874665814453600170581435306674792594350254610887598332942194741495882331538862369813458167400580253173723189529350263994469744239652974208595409783715833572820797712603002019716179307138276060181701674177428736049429149797664004611079956017295196252957890844127128867677075049650430396318798397551429060988758309683253767978753911099615434970166708870436638501594171804068269923661969833755536739123593776058456130540504821096837471150421391045389049925726624976620799424653072940119200833302562438007537447404734386131521034628578787348919469268813671092767748222787598717204014902891198311288659886453038762669021123791782745284995695243470021516088024702004980924874633482158825760584623238586376051678961742550579964436226750544260417107242109791556517723299596710714148703737310949180738966617948021698482116874864385210419740339388941376554729711906521354048083406958192358775355325345507072554884236740160471200259192566137094372853322221762223094632248220548185456945141125865077645827772322028652990486811164897145703431533429290615187818334391383828077139094311820133411825864375296948673419508392908735309533794376305482404486262153845151304245674729526505850830277816734660459648523460411806223632018060140822898787537826638236736751423736216559819748923681398783598859809563130523214652005683927088749355217131149051663499588885886330919134346890307879961324344245434284594400898921111984879378661668306107937578725335792263176557153878942501439033799035563039116379919159618164339126594670691646729276045965557011176383422843664479955728477223045422048303147106364799579008832203805312334786141336502003121104130271974959332146376010884841925918029468341023983319772851851664342534284512591451020982074054897782588530597448807380584790251174403400238997787446351083672030851327022087535958506159285135629734186095662860675037323703747160879949801105821048487074621182257059586398135308126409584794558377256124386237830467323837343503362473680381578999707526775921093389038187490484497312179534439889042136882192310807394542570423503986970240038791539314459588021661648933510351172260677915795875497850781049984891592813453981194596114978480372421470118652515114050411513114649187392927390975279222243409044636396912608303417495052035400225075553781946329045094985071941326489996016916823325216289045354447354144050536509083841785710890721046478853309021167099375188018164239801696329633079133423287468617852015848403194383956288270065563643315866420598807502505331357730461671330715263435034824503558539475524688019896805444836262818564073355993322734575900524731273000040150425301379127511007660411996040079442458594302495932467555744591017938218516995885228130963020666374760378908193803561331317453562691363361354611668053607744081182902070039627101880107640659696080949502658725031197348371475602578643801127706709134367012875195131639234938755799617691766597157349009302256648315876942533494115962323538649459020329598000862487044395337155431131013558695846554105884176417471347065293777152594575396433576821110661608157633901890580575884751567213983771538554347215449337912902861615102040695523346094241892668483532972691946732806677315979384350301454967139053089328843395710175363423404688529792958672602871625669473512483023574456170726531260260946103622337174958678711850229459265537116921432491080935701898552913255223911135180728069171872891062429303783287026009016315716944633919378928825723883165682544428615042779534922925502649177799213581158521568158502446397574489100084879041497110913323291680911234810644190354794668172165378953505813116318874451935588145078632980031353728507979825565665920315276501835618753883496574252386528550555752843027495441205710405304638611159558259785718071260837463137913842597005776779733557923959753782007797529213511124469320394528648397077071453476382189330456814947262443238283693818278138742130574846019552822985604546612483744887207912067845279067463815407828656789627494881030985107694337930545926547433509012296426510716888770579076820149279306121299381655054952027022977335524127091352403292373008785990716311488261080490309254583535811987673294043461070581913091893080936636115904845041902191703523201071787259612447592676792505759677966780452587431984189514319347175891229710097096365686473870394668607558038051588936187179612143798475705278075384349930191177322696048657400014763260912331412279202722110386136894083215493922629076606190648325566402723954664692455059976157716620580788754045939267603789964810044706415968757569230510841226863188335626223259706356490036456648924181052223770415859279916782365738594735517943035253936284458160249089252540393577186711907727259164271416839138540376190055656600064257272234066886224049144273431330413829645578960245276381213558329997342418781219387097787222357594015898718426781092557058092859739532385394368000749767108956540818781858459815407818695572901424772118023522678371353095421976241418691028000204265310601381761839280887252069818979764758504220831106501028185521829701363754196239360882890594202775941577975089261586955359977289873278823433293541610042350356067122216096386616651954495143585357708932399484513598457803800808749826728824363615001756504010336555895332804363920476806591766278431679053668388627603963885414289439458464070206722458205258166950802964072814303267777876740132506958968087233409171300526778517733904003289371434899975981736840997906816115741902851430181786713326181575271955416680098293696540574046267437039512151785873275668761543850231612184977894694935246302815353707626637679887407654905090274043363509917967971055508277358228255261720032037021724784380712823284038643112418764060083535874850655753002234160156923784288459307336864286469807863209068655601511818538160113777808067018484890368284742927677047799037476345520137540192632669168740608456730741177178877910421413550084270220952817191104038929625042700621101042348018035592395814083980607333923224063214017706195565269113470819118710389614439662265116267024838305932242153012585666128852756106428935734739343899090102371508357315778430818082281612497811051081914600448559972827189212366348562276521096863748564522601522836467489096204107031943168847093756146432733254310510877058981575484478312475789678500465693680957571230599200379811794899000408522453208943194637533274877838620032444084054666122791538228798508122274105344560918421660909431966213065663391903510420571528276287513936427590149123153659453247668880384252580860685522708929772391190878613569747105616267557722657970871999598423567174785065483690942999650200577908282136131388209014355457877079862945319452307119868290433386447955204453003966215305376845062457862559139718646506841289184761081170379608471444998100858013325063048414873814363324034007806940715284690366133104298538705401413557371978650782670338051340279530280798691039878257086541595412171258015869453114209998969123972862084269553172667362635960143002024592703543374501375512557282260274028696504420109848710726436876464883065705050998810792120677293673583998993466899168700267969980764897320695075843573224646757856180890382606532742035206458623542872260827143221389848642948556565071800150434517846872802324425127417431258428308071963629234948095760674934589629845719662968285652513693448668835853248319759608740716614581476514221999640547376483602031471307813774135163763491173434014650976791905327267186992022483428738586855935367723720074384474949712341321238520301025597375659385656017148986957121657129834110025621044271357895265671534892080199098542882169009910595958948436713380345352476106696395360258169682211637750121156349580825248660061244110679902128745055300138269575958449002147545083559956031766052888223796335450194196798699171795633203904189952604630734021921921228481130132654726544095150977821187685183379064045353585395430267018036660734909163408245192359244775200076206192083612085469831577941861884660458350283992377091411231055397542746374259732042017861222505314111940400302860724642754576538241456722757020830634425778112251617404993084088417047747816095415008603440403265658423226973486739184425896621068136329186080532906608514234166760300199309364742888015621211710361049700580845783432435649614154609150154965516457170474710283842159665498124060704063464243394363748028511484181185566021930604608442079098582803126446325655440082382071178455425117073958830180290107139791665869128616263354737273232374401449257208137848313191868404686893285498673666589118399129431182916868718295567608644291712503538673835365569403960548071551112712374724024300579550788961323252957755907322602925352173223841819786388258724508632493133180526462059408659358184446424675320379981399962127170881709631055197700603450530872723073754389614635916391243226051141922253223341435262139566512605879149585490301218536218492434309804115534183183083018503589744799382318105456137181247133285922864966127225285258412932181055251103552380083065848295160524666765105954037938560153512546040572004655023981253731267348632892140022133211533705564104883758467874449979015739375589192513424564175325796577444797880730748118924718286215363953834247825883843595483956382840139139748245812677166028154786715048909442194090210735729291510042560816853038961042824725280565150515529600968887764274505282171965666414745578032247009048757175106815836725918393302152718345619569171907146362247470520055968725760858733223307639098163709096769398640712618527242053179932441956104932054081703891298390107140207409724042106312114969977085487037664792203603195092086448281709223400676668283610504698608636440396606026189697499708152165350439589551766455030801757402906237697245959849840715231668791768500635301313036422757667738281442199630221346041492905125863155557817573114446056286870330618283061980463563119055671927898971865795744097683907079998069888535818762062268092744398622042175454225957004435212814532543616097338938440636633760068444824154299043305340019556109318202522362701812949888780299273388613136975822732556342715808161476596121870401470789675277766242452731042279597726209189388638578732487045756906229414074535488399358987687950637914538413579269681144908454883498414796024816282527308557576791227134605302838338307096182103410790870363530944179054254517330982268764929562387176562572373243832876072729602677151703023053348694653148509610201047071522702697862029532402007702587104968360278736656675538015138000711226530185640098499149143684089184943616800337677747604790252218278882721763582376598723368183425562453278578339141336589135811587376152040402853615753844089939155790961519831882099532989537993927199933822033592774496226679696190989726222733191782650231166839942077425437951502569511184735236266191787748436290237035160351734983084840658965538422978102631057875165913971869963222524448095761054981357243107880300789567816565621063245987538673626476198682322043087378393011275471833331032176041783645796122679515181384124221256382917493817352948297883200879490361107375062945755165012792984991897216784334286583032930127727950977500557539764397169634593736811624033437165187826915800733863530025110164137835837143858119026253128528131272606689212604891831174209747753264967100079332465041072368950204986256700096244652876683043311570982466386738966312407703227763474714531165388711277536518197832749220599331961515896900293431422369835847287434772881229984625732732809789579395508115983718421682952414035889213306134089078201488106234745234057614038446948235855188876995041443055843357934050591293112753129809270691464471312231024917067466182223492930537547372916340919082770793302716953086664515281644394476430575935749121783120312862884889459242098791265183906337098873988028596572796137063072081620722095516813043638849671182629461743606866372989070069852346205995688805220455004116397068106330678416424211165171518259229056915374927045569723919448383668491014996574632602574252467664205521471365613967081427059374476089018459404037302368871028085916061759010423892746796285211966092710008134819655582457138439023666444944891530723560011557085541565411827972609059229111127397226427629116698421983897391398596219832987156368738782594437893023941042701424644414086708556238888746645033835725629988268773048943265547341371481032993137143805554814496307470405895876302058560230883482430776645465119255648809144708948636412538342277335275751572751372446894792228421604657166669773903269993295507978493647505792280997499789246419864086990167630347037708777224613731254119345052268389188171507033953296428212293624965778790948350360016421973394044452412399224266824898024158536148457434213366242733957796079723623977022985608286548054129644313785693790557934374287353233328449826608313051205376014241926948821299136734323901589644428629483929404221881510853170540833957501329075981265870145384780426696760450336298399024944684123954304186694350139242512575214055573533219078625595654506575681699072565203146347216173447335173123370755736026192689837437929370388699416297158649912413517250011432242968265199820201285954144825232821959165666107896169208671492458377776249215787552509646575344647307422465423326429392152423004052360721153457253592949492403097525629910898420163145166185911562561752960199555784048725709249291792810374859562786645742272989972525467622834487038796465828018426717594897076745074463811550754089804843219188185754124341879969296851829036079963082578199796004955232539652960074116179854894856313316073228971848360244723519616575592369250758341622753179190894764703211325914576710306847315159357359272977607375726641672685040994533986221234325996425307431022601884076697597718771994081708400850415985438885670427617951757236278628683577635266112681530724520278096375923533828352912752994717601742038214560209829690103601941545691441836366234036458040814909716174697885680044935700868734581083573849480267460985666775249982111539085280548230383912709829269012073430170276198172259222549613119555244144065338721893308260499561691437254744496258463236888265188277309379773682417603587655081001984192025696041397088330848089185614182955063699741218308992395171698220373016511483143443914157690063091927155804132750052568219978901565229763640612932719991842163069636528263642824212850805526813779797173134680215392114908738221620931275033761918515875292410917242397116753349825223691084466303739780785210585338299769894691620987832106771404824371801492797870391049671303749323050453506947491626485419737816893010971182412473409207000775812638914070632597471994209863137354879852769642828700378752373576530481451944237495211162201121550860395431579585096479778553146063747014637733526197508493057244777265762428056676020077593579406537909531604652622404267828393975246026762495524363575072904577510760049700232052110480162986516841327268823920154784702112675674033049099998907077096907316402674865699806609843961758901371850487980998849092210439390597163549631211768888555269215452620335390255249686615829707293839768465425303788650792317601584256854750057531792193110334592502237605428527575110755634543303600574528336859910106207401638044386816863382484241806254105892047999649236826581747985698151170965639418120843859468883710909579864781169659795385062888835113059997374070933051254432835144651452730460690446338409880966109457039072896467197514603531894666236916522063339884216607674422820547061878801890644407405005297229913302907905989142668962399330477905791788840993859339189448842702091821435290161943846990838809465557802272245361684376804705730998196227422255998497531063186046339388885080315344924548852522156309817495246382182091170182813397207177648238750003281454020706305986631844082852382152907869276567945287377011407831248292719314836933657948720370725576463397477910330786210186110542846909059570837716357334196889992580491934386403646177787114125991076575215594071754844512255300672017006398520493763296391312546178465934317694364203456231175279118241601817994306053825851788275404207507029742940394885299706629314787178170012288301675221361088585540013652866459345122648052430544454738922623717360205960207988353514027996049637943629561010850822232857411334356832633050261519929532029564320421258733019611313914563382448992228140724182383681244953648342664319660717610251899615717264870779936476907176205505283987266119295438992422272879445907906015678883364811903413095647831590128094339976754886945541457700620475959336707369611589241476492461640768459267381852344960429303161699202710553466641045206393484743062461243195396164578651399435046500761075777202760982601136433411690243839582809040626594691027600401165936716934892278404446694606493857993204606232018944224554798158200523410564443488141766793172758844260998734710961833531918359661619396461926332529677237590199176808231815967876906077143858813392535013059603823260109176996696506116178766611761855554961376636946668660167448652954408060562070235178943688385179029326434626293955990817953919486951544258997832284911755812248749136493939837707432235935529117788085255396132634824496109162108080060580390541248229902771512721078221592123055930108004427138094286568360330563318218084308662991481109628386467855831215477865163776871997519328151709013415780618918771478918919854914154296194468152273666077423743061544950596310904448403007425548897109037277480972163670835672539538449998689312373758669315774264509883124626980967035655029131398613792305479561124035819117691203742369119465589782234509863125831055563606828714918892781085447122203918667819446414276380855205213717119761037741867296869124268320452748990107714427341442676361925378642418301349722555482023301243849003842222838445281521322057605487804319041746447698920151954556062116305184313170709790188674724727302997759172800711920699360802063886569174240829804299999523206760958141293877384569405015559203473994467621937829863215769860655262603133191365334364626095943232408992590739192182246079010986217319903015010301534889217980664788324403254938505200168831699124840149090307724792109135193581334978980453959144421948517385726523748989575197758434898688542906068559717985212861609354436320557470737689343713752675030695577044546143840004678208388540426881739449913507701753208395772678143431446763872789610598910353393327933983049729956012931601687494173098494285210682640867822541915736893597305275198025701325854826155860156845842261912029699309965219373327871140745396567573273856307816111226977214979759176835322753978160811867041793816448967839795503872543666156544717824660368965764738108535644744259013242678154849116803726409914591785248541248970129110386875628233500985207949423219262838418057121695256044990188524077420479497943082095944724774879374625875467782415157uwb);
+static_assert (e == 925821277647525484046314922262107411363265829400086205841317837788590377458538832566422535905580167055590540520461562173337209853598393531996558937192259755324623564271420749979078242394847832050156888254166767598483964763747510305591639126359672129914819075958398814517972379442953401990418883055801170251042496643399669365177755686881047601033431572385651795547449177291014110752382040436633930697717204558672793488960576787279098167954168025286326942734793133599414999250387371144720519062421938191111560420345811716245740999562260508137164683070430054264232500900945124521840380108902479297191511879673473738073802259631070519104481024176621009769537482862622220299889768219359329111297124699668221641917569303817732214542510786504181161038291046117604515970514526672811868669367519925509210900316168776589245861481601369507782419794370395588009090398256162605663472407280850635481339056935947008829932423384655897146952098325216158501187401583720533840865622926971298423980097871719853666185197908489154572238149433941405941164339863629962456926688887074975888925171372074822060989458002856037731335488111740134826447412342315923072177048815917730720058570926669739420564040395611656944347595783660919740753053095949114163591726463068745671914535691507335209161651500762777289019870411890029385283542207950572157059715527520477577288903229077134225204031621305765807024135459128591564879806709989556044144724419409864377825737156564835868452714708194913413130770477086140770602173550749288483487941476358374943226240425793029573928816763061325585404352031096633518420697013832209979988937372645624495167087838006956364398711637931686740886942083658320656084460667920068505669645778267276911200782434761229862188810376114594126248643500176491287175248925185264495337015989755876553277663628439248038823225602576860638259223957959851065950122763885066887500727281206383487362790869608989703225198487906944156585988691054172626900276649487253448611243172173965980941755933468623762960652828661512425506726804431508944008220647294736023754733222053674360993664156809830389852376023960904244333433588923334584741581389284817600403215319262156633859860850188679280552275362699224083219505525710127532374249163813824350987705730879951355264625353344369530037300751166274140471334366630754712647779420155585685556617881743738385540176977898140007217988800315176487684087116169663417013291370800831899096859531945204190716717502573025350058617787635480933089670306284597585818734856088785121899451066970986106201069863672011712515632440863210713872692755338035103906037807907048203002858238477860960644492643563977654520837191979524337723119259608404421643097049642762164294600723181768063696426390167022298401232205369596435872999952844226940995344564116630547371856308484927980089147780783142944503353476234004345803402965436092320175500244821165897252117110610969492880654829004789895578451575692681704725789759821917190608779304172351434076882695116684651984540381892101832817443304972678790622161153031424131962661319047280118731622895398562931270490268724879492475624986166695709225686881866197787756098330394876207857808917156059890517791497692592084725900225707789400920109586813314313859749022393670949449440053474960231732358062704688307739072616923416724042175976602907009843069284397933767612588511924496143157162925438784118979955697204347276653750979525739483874670669758573414142808243691479623929222974232866338808714580720619054812299696431442314820449670893215407292350016337713376699327031849963391229409806166154760509553415749785479654053067398328168020591208777537261560091226352467020712077514638290424834182192144095075007314808554065801151996865097848823621532965411348509400301385467549943306482837716125484654016268824276633890383140399157026813143195233954156740378621479762034345150366471462896094471724972132934259234371415619656132888252595107277891368873437781551821825058533495432015354958571532246066759818861276604704762519082544501137144991934451893993179733600794009778918873730272924487377741238051996430766968127830812630033209354371727945038509809956393676483669979805775689275281982179924965339949879318260484504531839430166222394398812915504091572095306003803595205227400518578902395452068924514063523522292068997201688261693411544059054356706121760032336098061894411892659021095089202461966720852999595670850565525006263419581038437604503126629135662749715654308249851965705303102225103187660218539056082373922741495192667063495055261427574338533640873969873350429284563536767411909505209274255461102828313663935717406210258786433584197134620910389247874905921114613887579869940542867067223269133250420424105415946176905656458177271017679129160751989239090198941031674944197520677810416776932397950599133491316349287341573552540692293389940564264376549311679136031343692195347738666617353185336134422711920920844399307719314978136465976048410259058164969778439241674431316067395494758148840480886692112354117101032785128193937723745773065158101867146919612180819406775396844129335149440514481197738822995968228560848807717236586943646824305166818267294980444218285644933573502760381857619328308683781861219756248923743795092527308806372681676276144404148907769558418647660002483413969357909782921068829991250280120081201026814146299951127127610072311896011620199302450411006668075365222906756407654674886818542441552830122233595706898699872729786995398578270431009457368799785412790631316216715005485273371082998479926397057401586572038045306633417054489750538440286890689722739366800162720631591247614863608642224493153626576205168863122173579721700536126715014031511726060567243757525868482476617126043798623940056069396100653874617195674699607791498709445954939294199831258859982271624381652130224970790313748637013345915294979530795868152262160914129486516964231044670275836594228816755503940204163740305969707253292074475814676058249561929433134333660057287301101601231820316073168618636908190726177050175247818110578055560560688796401505655932023842697754241774588374583062963381557220895250630953485229368124338847090290027391396907435275428961083688904437823309592552190497059386493018787504765076429185299708053155148710304044373870518043787954080584404302939574749896866935415049254281838639079551782780564219871198249887864355538762502718959259919546646112503328969319950600561471441299743783716668847772659164854260774150186393424240478270287902343520007666607468800826373719707066137011314687880480610962685179005544933533910568379444719823665964430839780728790312908721450954900306036821156888483515412321692126129142199751034562341661408706136051387196710769170808727480986201380603544687267022728636986681325110117972770888046653074394859695327060350191949845163075852867006026516825334372326375162712041928605870230764353151341123717849521021678793350888734580777604926875801033048153758377411158827346523524411768729956869595658251889098064558649587248601158119029099816578206772717002437661779578738240520735444629045137710953185651212029211246365385921614991669030870319446280256529788199452527866424798087728941043658956252705695603053482413759462700693700396198856191108905226330260487967656048816959593297497053665480866123890888084442536937116867351876268498070783630979926035244163040376739878970300224889181049042406027162195776692731462000545913208181079180867135918324675694055853046489335938390647015590992212564586330238720324943335239947287702685301470854427682225668715032890232716014350243788751768447794434804639497493507073621826571926761326808459692590242410407317957315748210250498916986581050910401583890428635558533119546645249639493352412276105501922854605502224127761658727287953742606076981156611923074814756799317499509745248284124488946539941744572834694649627740946208644282250490064195074307292869656683657601797057177721239379124263270290244666779980558690255863759814422128884734790463658210245352187577310420384040290997731732542997922603843129602152306671290627691265725865108615510456430871942239638195209261426513500366098272461907343221207963711153528093982853648896096575798186268665189310896623817510846345533080533140219528981705593192340721212039582958451394010024357999615925285263365111350752152668471111931308588569544125617452251181061448878620016892084290648228327302043663656711357478900973839476344562063251135142126966016075546263553162380720933458207021727310291418840276839446943253223262384684959689512677602663732079938322408518253951573835351309616179244687166025972131912707139495128391953077031980947874168604119683184664472292669848381795716009083871277556612306170920196488394805408610339875406019601113294843242620641631227050396754855645908196677904279556854314392365012070695397607233869733732555354673786608404872112006461237659135939679275103781149663509936946839995722971632218920136654648803799972140417973321580604863072421391340575806397889874629780379074048070658779849462956748626382042782237133987989332960693947107347322070553240815226240781284897941649906726782225942376770704312812547551858324243572433971646340877222604560978234285974381350714487510375554698400191780868985387925205337522055254786165264786273261600448085096706878053834421193793435604071890849941164391597386395848010481495153892474310184632151139545541072880969618376592937999859928026160306470287401211063637917126265042524945623705790523166204475630950333591915029238611968191762728143401485588876210805814128969245566633882719865122176245924463431951715842086750236450006840051564804190408841791940222692500559490965372477515688268253907405496642061472907342914619010121657212579181361467764234637924865485254654467943228472410972274349854112832298416317954400352112014820699718681808295773157325470660796230565624096088825387707637204654499888032220345920989819199754462019497516156333728274845778054436974267467207501484818327497996634691908114728824070307789831590463706387785702300364749922544296903520329009609348748598472207871485112473007786011386600419549232652084046690076837253441970589225666430463772556359249502084980591376994436651741109935603108812045858836257061111489108694386435643655503570595363318133190975314435624763094113576669379299879979047877298240040979391202391964866677228338860102182004962956424168914834364344806404249386400712534763031829932743960305692761446072279764397234750540149429403439749575848830848657812222791117982664155619963998683072850912914322395766334779657728184710326923706111558881079866807532448067057406387379253229971248972229112839251051834424814052803713705144425918750145936376770334989969765941522051562319527592037603944008196341741771777848899163126744930412990444970629287473164038618648207526802355843985009383313264900148884890437451555831118865237299650313800103403674247036998590658232213046659066945246981994423069267393751732173862753007086921667358727996969128214260798544457265686829196691538797403013370398779833123532308239888530352263432384546504659679350788619617562975098311033202992160208321823263595046929594372484633167764684371063478592389989019993262289770354123954622487914983371095489879787300506269973836370262923994809081491851979148233210464287723547308268289545956100025353727281343306885170982649275108574573731883099312275402899355278010561115889951284552584210602172192240235668967937144010856156904288525973206965937001207686254561321773686607677024015765569995868546681370481610606612305336643961295748241327849599352676198386527228372353464255467163589382142154369711725391415150151737427077090938503391036481370835248615036035435239805525524939624513586824779990843403584223026036549164871994498279585076983299267350266471423781445213817651822478261150255874775114605585133555708514031499589483260801164738064688179949331387667872882453931997456104210519238094969069094347377374389413541242199714835857089203684459462494870779614545494951490685946503545167775428612031749346968651237139763717031086363001626407498094791041106763432551280829882335809472709855142568511616100186294425399353967187772580310395684195656686846115845499108406502700569267254295406499817588703876956335949148148960788415278113818141194000719299627010161982704907375531833943096522360889958075510189999882556652751533256426724908005844306820566942462454815614379651882905999952611712068181277375771031068600151105053225733715057841114673643294161325414723447247896413844761392712900873991500727727988233012755468137985487045848323147699725209424244123873303345760534627485114513265503137177270494363511154154010126502031675154781468525410425582343562369254805002623756722552094430638213066101557324249884101582258371550962841630889022903012629467213985495629174612197041783095535483671731125269178980318929998149748008732059177416300672714752080719604134060781771051728726498516455316263934982877808288029831289158518619994126749438610499036246939468147866808815583628635866352666003012691226678944025246264467520199665240846297381415679648946836733478583637226664975883109220259563005658134769128244863819504484695987609363181740591057926507876779223774228426887733534600167683413275733171171270019603279094868615622575150422151703790028705869976684174374120840564080248431538776051720852458782994792785936334978669805334758824884759378899860961695145044302746444751642930185873173329305382132062149406379095533148443999367492106392631221391752474392696310805042226934345451615316827944781158323260483877728010772182364455618254430262105733658004629703164428287059954752943677755230683385792422272308382960568148442648521812726916908473955619693036101591838375145285769230472979404087426741547381641531013124522936059313874952339143580993610832789396477651427096689929844065793223009542113167750462316461855478190328834520247867562981697538905274347803151303382326837667926549784019228244459707228042200246435557237296895455131340248838065579792009722304766582554629605581578556681573590748753636612679599540171330555661187523819744087281037159103595512553735410777764605456477949855507965732993734959932675737107114324664945943782423246976584400383847339248164647110781898130986963866741914263056327890373726590220101946401337369865956909412583101247130992986634456295774045770365699491568498700087644325800718476354842411877991082107110921907265515434055445483828546895078607556007597715422679136379038955557432552862372826360828027222460232258885433338573416736183915685479701303704169090476673292837808268808618290572192903169204879129040601709809192744243584412246495712375554087815372762877034756019516026451187231771971020372313035145807498295137052077097875760346570303776525027990167687906412639437374329382722326571991231658438388194553372063029334063330040808178698069781482650930319107112425002346994300962208678648414336188668674008812775504408028810609235995531901530099417059930126872981698330218683036165021988047868722244970608801844857953841494207221711214149875285075258271377921688661211419646509144638419930001984902754044189076330562777348557494732075689780507188202817812141664869508007135966483915775937944747297094500891628667526280126080333998404053740784126418138539396675750752315216878030933195589338833030254735958022623267030648066711592266070181453059500443564036283847411309644435370856412705956023552243720250796266568065803243388752146081981140573461356567703830118679807945577667574016387858372340609953359965086606647146493876713596821337835204436170776131677949232013227414096628304205354026063813469761303258719571993966225488958555093510427679791988971742172779979160922404736762880638975534962742894170841469656176520040761328916017189723598495076611011733196408040688628395455067286145659096950255539579524498493898542819120837012716973317963326487849849715816371147080347801323811060493129264074757544079929354744987108772532724901250431897896897092387811630627162295682938692000390799380186457408883817104297882448016632464850925981359863538329736159272918094180915299281795598292795892856092097063188703480460632536098280113540310786423817088772720505027688114038400828083435419652958618670207960650777062461355274910559417030961671643529156548924836502550477472694370667915954413329338824630200776333664812570409093806671470985465153208017946314158900781802567307669191878751484541748174663621804204380702802179251961019509169300052486002788063614613203094151093588031301465379292063556105603936494598372721962197938596354257244836631392404104249987383535354722179904221179866116779749977897677368618081056318874360605107874352677173957972841002691713804847766731026566566458338088565056130613983832021989821964722306831167603123999437414390273779602339099084350503010746403627846052441086604944652144679200545838398031375048439017447852050336579754361882763104670283491766082028363014447117531598447417678699769199955291379423547782526702513838534616910733291869941851842197893695263196593800083998981939690714086344244116829570847891514360775644611936068668410891121888072989671551040770844686050331981671924327746963849622675057706122039771668798123652290001766715471057273382475530294964577957716813904563781129755046076195618184532849854944607763244738467753108136589490285069089300807303423783042724466020296447103622857051676984063780930235780424078279226093967571953577579085123301797349159025386510453481391811031020579578896736388673626563068243444220092728433031839438654271567721273844233939318850279293315407811042192934736150988154534195150957861317891400276601282474543791458850609927220168618781858328688361677583022572402852987289530903439428291591351640826911513931896234378855793926094184629649867461377749820862152288361311783428144898687311257224061894140973371841970934601082910985534446880770279296961865075179339207939540667034649398632260182465551928975935233834664323653910774960714073598940999871889404546159059913102803430112603077837945473322898835928522370752743776004767790785046192909362420427454535328279162043868628615367414430148444280505973468416702467121091075677716122735981853155305087654090041184203543897366928456793118364387536804232658134896980836455221010943495434855043472538001537621563522139593046154357787767005431104545971669418574851780250907092283316306268963575222624300712467342094598896648057984691403613468974488944872998622837323868755355189267111780877757568894059389970538280324764242551100008248461368426518187213353352357694434213832166987557418266406227696226731269684792001568400021847396528021967067824143661722248433981399668779553795275336703143817493437527034996864062750575476033683476592990160272467162084962796568071976074871258307939299418014923559299385665473033725113974451523809060277107680679572873780993418718878242541739331014400659375536978260477488357552107556192113366347417991104642703118092203083908784935287088794768526725852335467431719632035696961197574244468572784804202348383106161583679110160287614379640906594882850609519086285042813749276356637781379038220846742528795286871479100756150807333745975474958321450363517740760238117025425974486078154207830247097362626165324810782122767883284045649030069274675687700549598368628071401598588410441252531499209707332674122415338248580890294783064345979541280969199051704799741386653088518816114562299165926309199651937446790392973333738006627698157890241933414100089173174831431184707510434403555662528452402504077142425536804953254061897213891569242003073903768794005932350898891391492985275354272208278492706372857379439317642872859681436000458822433289482266728226315775670196071226105231934830048135875895979603688395385169281157101689790447091271008526926070764802626463647543922527775678125834056317542431590664776972614685296274947164129345320953791799602460255113053411734201692035340147314494078580586501891867882863976375198757727260072182528363757963uwb);
+static_assert (g == 29798432244916674188267874565994511129465120803978788344316864814816788118116211967064993859202651457241150653527937300318139441398137480739498016605169958074338468812974247940643983119687412709712298707708639065721844633834030392754622467082167575384256636124970912416863467750122830431140200433047618208655095004510815432687783237399333966883566662284249473184266466494555781284661942394134007606974555197496847111970137021016999418540004497135190180698605565746245843253924478007019667216316038918311843149665996622104492911573546889531777540730482311189993304911007037408068009066215218430070848129328418292313395373962245129226209492855153844385373084110919586111468993602111024707027363861811899881912842982859068396068358713057563354536496215662738647102018858667173959375414318871177496133849959199312926882218088364664113311108693640122976260449711327351932322233788110835455072118555373145049291154743494115590060507317111856539735032533192218230483260244334704193889469794662184966199537993963999078475259216878312482974707442036256492782509772373455272769273833882315645298854863311795542608650304882161420040697211181665252342080035197173802534749769469724703268158024710819175669522770851475093176446672238329528502908755349515870984599273679350446826002857904638165429577187227047143578608071452633518342471271063866280346111762071869789364903979901717205061699969843702610929231630805060328615287467659369370840319159313397133502893318829441500860040361733782863054788093908897708674331583672603407220706479492676072388733266691156305962918416232324775256248110177992057207141301567069682256206366821456168676509466261858856409938472156321638861395757026663407211258205424076803550614986657484594005574319169124484702443999652049989150938063489591743426294245993866451260505250593013109374230205818553705481323814467997764434232825216265839479482674731987963761808633293308337512265283871364612091159988201854370660145184476139485901491033635913812044790756144158913525552429641012849929727963443403717727376487350639360231917245906451656664043825445552575910730367456550208688513910014028364857635115620260661725890378663220166170586315294293674161240986703299566970473620561528908884250063780883792514734224688857563036631219375697604761545663806029135955446308329698729187633118726312957682328458165865329528612815778259975236473921843981997298878825807911669198854508239886525812277435714684005819874906489012032318711200528590760750570526041852880637356865931470793479763913927643202410399111751142093604070407422948063457225322500044586890851162487991894225174721754156861359977725394051668830407469004793273274348712069653223607355162389110859799061463530280124845281291280807143650682769463073672563974069400047110643228833827027461693537080439809461719940027498281816925274592533558602395110549455677542858499427662912175880073255153392214064243908048250185909069590209744180868907760635944391850223298315749825841911357067093249040115124993758536243030293225525076353059013123513325111698367182126915150684907599519814623893088542203783385592662269309532984292040400010214779495601358956413902867199644918537464229778619633233694940922502004380517602109211347567613595105955983216430889725956410713259203298246729608748959880055703627186556401864111638018470966012670735995089481515926436830314775679719160087497370044975445626269931153113082589491706095558709469653105913401990243443281006865761497472274166770933023600380168828263796270922831789199991709935715817691152337421394560278747618690783171271473596641043754971933307758834432348553804094808181840424862922045449137050403287348645901740502665714464996238931464404295154095892302597483360400390905349894368195585539402232530091453204340306958822061151948990309527918884648436508768149153317544823591124206975349609256020546849488655736876372252212050830544466937747670764315669293329627518514102617563387649516771990491187310435931289985445526697182123815532501667217766095415711672214803130745000817763746855941300298444804381373550323960417069156844824460603544879660738559186868618886343869739140893603306795963472244965044168057032658483269336150393386192137971198307076283753910047081813222124156957062790985290105121454908913661951981590760015402914802952617772813249648632973163740452843731296254362782304147355033972630909824073748449028173804547717470842714205464845684491356562908731509116142387254835486442424180641204069624898443940690204887266127211533609905992195650506424940434101991806132943921221483671634998075419443031716104319954336198869316200695048883609675602643204732662053401940340217947023472547371529407763503959015869316454468851368326655813945200855080128542483589047640225121515223460096921289082506572330085372802157429561149070936426948551401948745143933947153735393521070866175780404741792183629118310346303334779175995003188671138779985580661774608808636114429379106468715113991360500153251219339447352994135563797492655340081747655877102423272282522093490036439208508486641371157289888819319721741072021088988838185575526314420629404039273157137765410457726146724738238380912109958473128084231429395806333577982707754174511689519819992445390193198198658674126964252857209724109156960517790623894027903793027127063672501493610074211338320954814508470755576473435095989167775767189027449015518474082166619942092480362630295618282318120120784478999847987626484022481457667372563874126148626833365925380661168036280884209429692348940543937907700655045159826358187660828871244692799325658776545285122623630935724707862474702154310309904951694032327191814827022575329978008964102267856794554960532273796606163812328655447447843939879079636519295465998645050724045891371587372278645762052618094041441489071969833201075688391288870817741047957072975950738340906036013816125144698235601966779945176857432857633399909230472912455927908602203373016718198614604928264423172202682557163587717390960517005049436804372462076787514085114196168532579703170731400431879295626043387670808835418558634677506586435199004217308917933633779528930967546154533842346719884096382881942924876345720600214180390787910645851233124478908442387878397330067576987181883304718450176054652199888389760748145336637283014805674257940619738290930262825301386786230510361804626489472048185472733925891779724267067453733096077343064447478426009793051940246437960227278263493197855944995062383797697382558922940929936070026427171402887628703859868935135079107329440442422076757924715656314319859155753548658149259529376550001720812563487422205664760779332226992828623190778104898486092380042779700488516917660657023822452904116096237918857457696381824722898116427936892835447067468468407009042078067084750876549952565020965668757590614127881877935221459340616752511248121731457595547980112335065757832005891665164905391633974616167324708883637006961506520792896036912627971590991704412331257521924823476631105169897878844060506322822415206964793339314218595856304487986963824904423128022971556161524749970501482913358319084506890437142764406147344587629536637264158168077923943554162127130293481141343347153505733367154880523871795677462334071936126263595187983894733622188425947744097102772800798384967456398866974517228076050160896508568699658252932716504698114217833892857487015573927286387074461795988559112405605411753418237862771339843397427624643310193743445651017055548894766307353802701817908959634882329583556939122162691594208513303270959445875971764738074360361727430013357247044648803607516281791963055729724246812412172071844637854708873681127474627331405181146695377571274674214437806915445217802775052815841975718045601990734416426330360993618773038694004120497336677710478038046243055705865865831174795450314028741068624141624553472680654469753078301535955043264283271909904456068340262636622279301829323206627968239913393816282945184963299662978583596244380198766900193280359211101193120639037252806190653613853649777477220096431415312315755563965267544743737395010806760019102516763403978882159819651640938970139344764659441590225162332671407148444880969613631409727647114892093790763899889575251819843426046454701461164266075412453030724977752871861083191084321517298250628434552232026386426397723496147104928347285904099698459531024308948589396794992195467602362080739396575252883580280220821638109567806035125118547858876658113425227036790662985374378852325482982045005999509082737712016309072932342749447188645797866863307956692202254274096257229720450056213784002994618833012774061411527155971154557389097691677678141035861132494437203379707367812549575427083312703505887015979470139355962755397252795113687602766495784089469668341232834905294201079498970320080406741451950210575593932460159381736742522819101649364144856706686103595233078202056255672800217818041865057688977839959137871100908550020967057057308917735988786388788052699769578854534978855415079111598231460966054321228995734190020325078812000201079027820474779442492631325689095753878633085497650204857079872554559473483419911768746015789710993375966794219776549253853530178476551311105974056423547355469529552560908854325369362455545410091798379902621331029483887682674948217956629284752930908329829674733920276770747094185746685996596412427679993681949974698419348014764002932434551929981624067136243863902078558471041489279445807895278052301932856585893565779292891317207843407744400767779620517520921670322338050728890045747983451373362797910535929269393753273012362217889561673925968389459965833685401690081841397162574712924132550520731464727484969352370896692414821612827317102299387105946365095615792215974376569671600616769751488289768809074955947363365918741991629059219089014597460766672961554404710097273003543733333910427577142506563709675650599245232505907077002621633894112388073720526721850175317282680734663880459465941229617558887214041112292723017506170621073751431142027041833994224029341012822137562826287139233418519120675175406976662350512581191346450770177349622645505283880898193006660945594325793831420602547212104618649469606666572347914704432825980672979848824836597174174529614001858589547531559654977293193127270065702000158500698214539788268688147372675991092422533558858644439593588202639477050504734296650046079656640647901548822757043473731619522399230164121224825466361924137251715058758866933494917083923326776719732155409909144925938224463264494658702152466050633205281304505215885375512199078501207471257652024000665306520470131745219079586546105311830140096132293692468094511925886272781358563926829224095578683651984200983372583665803571377476027144913648184978730933878979567253043069660012737872687050609798840108790845129395707870572912374332279382983724848624322539586761650029883161495235724577859552041602579347180037188647513083952602337794121166597431167370527762154337549776106370376153562655881935505078278498650286552410329632274646493785454991181144854679186335497390946483818038542665684787252305039589768256820169455262274070935643105621078189499806863932972473187397166808047422437248169273260555301215824183715525067199124002511185216150503341306108923690508295521642787129456634906823886074539205650887996137900313156803955685097335647168198343050412274573595260250608802876865485888024072019917345123849434033283566478908088265035768478211683223376432512441588787190764012153315909872510218339126604004796078990801028669133777338710317564240776134511810524463606368771117942931124804883649428527160017692567898683240236409226430799434265084307696860149739966884956352228793342336285107735457499085215192833410476346646383701031126925208288541002096440132320482015655980943794434204072206620053672585659226466354793301901487364350146519867630971691770986995057080225660905837503456552838203132631041791897154141335541677639190964910215683663487060604980846305614894646240323789368500369758091291245113498841329427792734330734803282924511704131080318489668163617828033603395900451487922230312909796925948381102991146822054674696487426070753396832430221618428295425257499796994420607860538645419531491757733336034021601535426583758567627555629938946859886544158530489820642241655856617038305077492032552858077568946392077123407218809443346686209401271493763555342851545003074944605265496573303231886857449155910337142767732100225936378105170371201084980241510325910452626303515593633156139236733088905862745695882083854190859810581160362070408267948533624449628244247119196173683262185913191513113413120834890358166551589156139594720535747080730112294593994121763531168883911031894535910487069095707175045214441413883884802410923699659922887455483992198926058974807403496764446301358667199255684428863794804385174349638463155672979632002172038865554637417660688132773049255710905333067787632676418064804368544180709337584779332643844014281294499087468987637559541868883972735107421654055148815317881757858498940165307145686763353409263467427598935862681561349845673024564278210709413696260619038530970875676404593624213991446834528296807904314996877361889127548706876660509342389067428760334202348176873902188764996715901220157107218395994779944228232025706880680537017422662829436163962024049183896623152251324568553859222919956280866164457373227617378984673998954294513406712936355130470484047172888327701828569122540112559029443105549133380108876317878934885708779481197872203584407950893040390662267527949738213177889303432525604671841689257389744714864585578792783077907001007366247010458342027047984410042602813807810527541755925124978790060094078974677759122005471591830027215095163800538956004584188386335594985153414639789590893161032065216627865562478243477492718987712336028170936986667727941311558639344162780955383819989272289059208271904167118532762576939936016139229330085472000664229184978349081804033101689310845610467686180433739112997151156369536100005937892508417519342890274027944999566791868441643171088511636287506843607494353281634216084927195204425318616160380027060137805983808724233258618373597362604084772620575548007554735347777391638935368867781173138943420137303127382395494860537617670160035924495601832037708702973800426654932341543282278261613196243383667905292201034018092087846236419463180081908614772996072182181475631925657135805746736769755149885159738078245236118655290281971965234305542674569161473901630756445921641134653221918773817366488270251547556553445951856258504157060074846199618221127220780775488108206614587779803010482980949599988435901666000892139982997311053704503820813573985517680412958243220188442951830553187600252244113193599181872435497016639064999726818396372997120756358317896887004368831719573185714636352388773401931148269187200760456815204645989551987623393621306594072130172374142854695647745385134266260394221479246638034464958250019727875388606182872986888783267877119329425439261928807662708446658489716263804660134040984758765172767392018690172608055362199607909977706235198762015694206501563061184219994813537596598965037650742184551655336428129821678412946250805280869978630642803771544192674966142704717514858737919262672330422178767701996082172980161058350281694837604804891891418253868499644666889737170146162672595758195633807151023528153597542333384168701376272552982942009280710503747128071261631293054233342278356057312085260259985144621746482929521601039472256832633668389692876355260796154739710758469371523134766822097661489603351981504829985756614646692050908671043534745910896810946153108823010813565715434364129438007586079825725640829938578522201512997903614656518629709210847565220655518550297524205877327265360786386320740093104940037625667310836335061646216571983748430953724716089948056286461750916867222003853823582795551925662024207653956362942482171653115616941583528041583602451893714531451905480724366854760556927442747966826238761875413903795420865790594905494790702579294909238521515589515005826505930386072130386589217894716686827488993215487103272779544227027134111697663748622188055096883894725483722705851459928566869284590930382532770843933468366093036527695687945993230017813346212329222255566336095319164589209582367615830662860581648744271399297073178983306225384265231838249991556901952431468352513388991468708608092739067474189472822100362609976498026022632560035118317611302900901331038619406127804916063924831183297494256578717253424234035974824920125286381993339752593386233733538479594764169282697196119372287911111519020020827824461438993089860086727372125993892847397206287561303860397419198856048912526671932730189638075028289339687312428642008826667579692987271950503032135653656758304596897823894611869615940642910929670674439798335840164484798390625939163760520381693557697796137496879028346725344730517178323841793297642804722421921020973660881331152475521171925828969058909085954920667354484636498136495463081604922293303480762098328616310257972292652271806090362595994022460593778967329967630217444017525741638045229870029346988014958084572771398978984372096138531989499905656918554786826489755330939796198694531597704511088156379062341123293295518802525687692186882544300669083021869264815460641932403430710625466965805696101573184162037649331430509823557536730381559741312755561207022942288392997545062374284743535347995055673645037635267101631718560797941766939979345842257105659818759024388745163435943430548152822772246258077883370773252929015899844104006131190134245627499981302192117817503265438901221817741389115833357581935745779927204521552590187770875390757765548238495852940181105538496855904068066688668026690107729150021075489752456818910460907620831637809136111720910366919838287991763482928791748202589855715467117114637839467261942141745735707911425500856498654501970611071951782463930001708380526113138372274175339335662509216976645164154703071438074490395763946786352790222348893491203713832049967892693792723281438844117355316466098637070993105543662349514411036242212001644754859251446687255243764019263618483003145105226068454039223391184981227114376461103289114282734069735129878443870014635503532648866626566667914901166162930587104576749414261153794064753802158961802642927355719918310663028215143569818970905632433269645320004900303957055632175311138456746844602835628904740418607000085429943093034316700698981140571877816887916474759854753997859271105386693600207306132365473887105340142508006162852906118538596732969987126166211990351704986503780155363871413699663954792800610809029455955600309822991543330042253679891766932624144939060428160579453101461433044143996234873674506037735662596771123861963729201895854603129610305096448743155140934507704061445592546699556299418746596517566849045890451544180847737277330001790442633829205995645608625832773369516360989588132005808556078368148568861893086235628443747784399629728471253481086345451020854279429082627369196342148203023724090997870940983926087765285728354735131880373997886328690240207916061276214402047198215843063673535384956668795832090551190886193140702678521430258815311225104047901738300533548529803349897158550493609982225769194034849807698159537877895555193536203558830022247566834435050885516469224684770384749924654266966662000902430627265289641143382738252234277626796684149644206035576614604674203041322937356663227140931005992313613604607015407976103540881585077144015739356504208743192058109416473577195313011234604304724364984149920580678685505306262473132159795312126331269718770461048329028893386454886617883785246418127743847205019651073400232203851162419350487342072044133458470845299106673918135646890264041635815461909682536651955578794886488715663089155422196473858390320269399281721069474509476566112352026843925757498701587450846186392850664266843050309911138045544674927859244458425621557512679785762866254871670uwb);
+
+__attribute__((noipa)) unsigned _BitInt(65472)
+foo (unsigned _BitInt(65472) a, unsigned _BitInt(65472) b)
+{
+  return a + b;
+}
+
+__attribute__((noipa)) unsigned _BitInt(65472)
+bar (unsigned _BitInt(65472) a, unsigned _BitInt(65472) b)
+{
+  return a / b;
+}
+
+__attribute__((noipa)) unsigned _BitInt(65472)
+baz (unsigned _BitInt(65472) a, unsigned _BitInt(65472) b)
+{
+  return a >> b;
+}
+#endif
+
+int
+main ()
+{
+#if __BITINT_MAXWIDTH__ >= 65472
+  if (foo (a, b) != c || bar (d, 71uwb) != e || baz (f, 131uwb) != g)
+    __builtin_abort ();
+#endif
+}
diff --git a/gcc/tree-core.h b/gcc/tree-core.h
index 91551fde900..77417dbd658 100644
--- a/gcc/tree-core.h
+++ b/gcc/tree-core.h
@@ -1091,17 +1091,11 @@ struct GTY(()) tree_base {
     struct {
       /* The number of HOST_WIDE_INTs if the INTEGER_CST is accessed in
 	 its native precision.  */
-      unsigned char unextended;
+      unsigned short unextended;
 
       /* The number of HOST_WIDE_INTs if the INTEGER_CST is extended to
 	 wider precisions based on its TYPE_SIGN.  */
-      unsigned char extended;
-
-      /* The number of HOST_WIDE_INTs if the INTEGER_CST is accessed in
-	 offset_int precision, with smaller integers being extended
-	 according to their TYPE_SIGN.  This is equal to one of the two
-	 fields above but is cached for speed.  */
-      unsigned char offset;
+      unsigned short extended;
     } int_length;
 
     /* VEC length.  This field is only used with TREE_VEC.  */
diff --git a/gcc/tree.cc b/gcc/tree.cc
index 6fa85cc727a..69369c6c3ee 100644
--- a/gcc/tree.cc
+++ b/gcc/tree.cc
@@ -1763,7 +1763,6 @@ wide_int_to_tree_1 (tree type, const wide_int_ref &pcst)
 	  /* Make sure no one is clobbering the shared constant.  */
 	  gcc_checking_assert (TREE_TYPE (t) == type
 			       && TREE_INT_CST_NUNITS (t) == 1
-			       && TREE_INT_CST_OFFSET_NUNITS (t) == 1
 			       && TREE_INT_CST_EXT_NUNITS (t) == 1
 			       && TREE_INT_CST_ELT (t, 0) == hwi);
 	  return t;
@@ -2789,14 +2788,6 @@ make_int_cst (int len, int ext_len MEM_STAT_DECL)
   TREE_SET_CODE (t, INTEGER_CST);
   TREE_INT_CST_NUNITS (t) = len;
   TREE_INT_CST_EXT_NUNITS (t) = ext_len;
-  /* to_offset can only be applied to trees that are offset_int-sized
-     or smaller.  EXT_LEN is correct if it fits, otherwise the constant
-     must be exactly the precision of offset_int and so LEN is correct.  */
-  if (ext_len <= OFFSET_INT_ELTS)
-    TREE_INT_CST_OFFSET_NUNITS (t) = ext_len;
-  else
-    TREE_INT_CST_OFFSET_NUNITS (t) = len;
-
   TREE_CONSTANT (t) = 1;
 
   return t;
diff --git a/gcc/tree.h b/gcc/tree.h
index f7d2775ae15..31ea52a5d6b 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -1139,8 +1139,6 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
   (INTEGER_CST_CHECK (NODE)->base.u.int_length.unextended)
 #define TREE_INT_CST_EXT_NUNITS(NODE) \
   (INTEGER_CST_CHECK (NODE)->base.u.int_length.extended)
-#define TREE_INT_CST_OFFSET_NUNITS(NODE) \
-  (INTEGER_CST_CHECK (NODE)->base.u.int_length.offset)
 #define TREE_INT_CST_ELT(NODE, I) TREE_INT_CST_ELT_CHECK (NODE, I)
 #define TREE_INT_CST_LOW(NODE) \
   ((unsigned HOST_WIDE_INT) TREE_INT_CST_ELT (NODE, 0))
@@ -6453,7 +6451,15 @@ inline unsigned int
 wi::extended_tree <N>::get_len () const
 {
   if (N == ADDR_MAX_PRECISION)
-    return TREE_INT_CST_OFFSET_NUNITS (m_t);
+    {
+      /* to_offset can only be applied to trees that are offset_int-sized
+	 or smaller.  EXT_LEN is correct if it fits, otherwise the constant
+	 must be exactly the precision of offset_int and so LEN is correct.  */
+      unsigned int ext_len = TREE_INT_CST_EXT_NUNITS (m_t);
+      if (ext_len <= OFFSET_INT_ELTS)
+	return ext_len;
+      return TREE_INT_CST_NUNITS (m_t);
+    }
   else if (N >= WIDEST_INT_MAX_PRECISION)
     return TREE_INT_CST_EXT_NUNITS (m_t);
   else
diff --git a/gcc/value-range-storage.cc b/gcc/value-range-storage.cc
index e94d7f944b8..cca40af57bd 100644
--- a/gcc/value-range-storage.cc
+++ b/gcc/value-range-storage.cc
@@ -229,14 +229,14 @@ vrange_storage::equal_p (const vrange &r) const
 // irange_storage implementation
 //============================================================================
 
-unsigned char *
+unsigned short *
 irange_storage::write_lengths_address ()
 {
-  return (unsigned char *)&m_val[(m_num_ranges * 2 + 2)
-				 * WIDE_INT_MAX_HWIS (m_precision)];
+  return (unsigned short *)&m_val[(m_num_ranges * 2 + 2)
+				  * WIDE_INT_MAX_HWIS (m_precision)];
 }
 
-const unsigned char *
+const unsigned short *
 irange_storage::lengths_address () const
 {
   return const_cast <irange_storage *> (this)->write_lengths_address ();
@@ -263,7 +263,7 @@ irange_storage::irange_storage (const irange &r)
 }
 
 static inline void
-write_wide_int (HOST_WIDE_INT *&val, unsigned char *&len, const wide_int &w)
+write_wide_int (HOST_WIDE_INT *&val, unsigned short *&len, const wide_int &w)
 {
   *len = w.get_len ();
   for (unsigned i = 0; i < *len; ++i)
@@ -294,7 +294,7 @@ irange_storage::set_irange (const irange &r)
   m_kind = VR_RANGE;
 
   HOST_WIDE_INT *val = &m_val[0];
-  unsigned char *len = write_lengths_address ();
+  unsigned short *len = write_lengths_address ();
 
   for (unsigned i = 0; i < r.num_pairs (); ++i)
     {
@@ -317,7 +317,7 @@ irange_storage::set_irange (const irange &r)
 
 static inline void
 read_wide_int (wide_int &w,
-	       const HOST_WIDE_INT *val, unsigned char len, unsigned prec)
+	       const HOST_WIDE_INT *val, unsigned short len, unsigned prec)
 {
   trailing_wide_int_storage stow (prec, &len,
 				  const_cast <HOST_WIDE_INT *> (val));
@@ -342,7 +342,7 @@ irange_storage::get_irange (irange &r, tree type) const
 
   gcc_checking_assert (TYPE_PRECISION (type) == m_precision);
   const HOST_WIDE_INT *val = &m_val[0];
-  const unsigned char *len = lengths_address ();
+  const unsigned short *len = lengths_address ();
 
   // Handle the common case where R can fit the new range.
   if (r.m_max_ranges >= m_num_ranges)
@@ -411,7 +411,7 @@ irange_storage::size (const irange &r)
   unsigned n = r.num_pairs () * 2 + 2;
   unsigned hwi_size = ((n * WIDE_INT_MAX_HWIS (prec) - 1)
 		       * sizeof (HOST_WIDE_INT));
-  unsigned len_size = n;
+  unsigned len_size = n * sizeof (unsigned short);
   return sizeof (irange_storage) + hwi_size + len_size;
 }
 
@@ -433,7 +433,7 @@ irange_storage::dump () const
     return;
 
   const HOST_WIDE_INT *val = &m_val[0];
-  const unsigned char *len = lengths_address ();
+  const unsigned short *len = lengths_address ();
   int i, j;
 
   fprintf (stderr, "  lengths = [ ");
diff --git a/gcc/value-range-storage.h b/gcc/value-range-storage.h
index a91833ca1ef..bac6ba21875 100644
--- a/gcc/value-range-storage.h
+++ b/gcc/value-range-storage.h
@@ -73,8 +73,8 @@ public:
 private:
   DISABLE_COPY_AND_ASSIGN (irange_storage);
   static size_t size (const irange &r);
-  const unsigned char *lengths_address () const;
-  unsigned char *write_lengths_address ();
+  const unsigned short *lengths_address () const;
+  unsigned short *write_lengths_address ();
   friend void gt_ggc_mx_irange_storage (void *);
   friend void gt_pch_p_14irange_storage (void *, void *,
 					      gt_pointer_operator, void *);
@@ -97,7 +97,7 @@ private:
   // Another variable-length part of the structure following the HWIs.
   // This is the length of each wide_int in m_val.
   //
-  // unsigned char m_len[];
+  // unsigned short m_len[];
 
   irange_storage (const irange &r);
 };
diff --git a/gcc/wide-int.h b/gcc/wide-int.h
index 07bacc9c9a5..73e431dd586 100644
--- a/gcc/wide-int.h
+++ b/gcc/wide-int.h
@@ -249,12 +249,11 @@ along with GCC; see the file COPYING3.  If not see
 
 /* Precision of wide_int and largest _BitInt precision + 1 we can
    support.  */
-#define WIDE_INT_MAX_ELTS 255
+#define WIDE_INT_MAX_ELTS 1024
 #define WIDE_INT_MAX_PRECISION (WIDE_INT_MAX_ELTS * HOST_BITS_PER_WIDE_INT)
 
-/* Precision of widest_int and largest _BitInt precision + 1 we can
-   support.  */
-#define WIDEST_INT_MAX_ELTS 510
+/* Precision of widest_int.  */
+#define WIDEST_INT_MAX_ELTS 2048
 #define WIDEST_INT_MAX_PRECISION (WIDEST_INT_MAX_ELTS * HOST_BITS_PER_WIDE_INT)
 
 STATIC_ASSERT (WIDE_INT_MAX_INL_ELTS < WIDE_INT_MAX_ELTS);
@@ -1717,14 +1716,14 @@ private:
   unsigned int m_precision;
 
   /* A pointer to the length field.  */
-  unsigned char *m_len;
+  unsigned short *m_len;
 
   /* A pointer to the HWI array.  There are enough elements to hold all
      values of precision M_PRECISION.  */
   HOST_WIDE_INT *m_val;
 
 public:
-  trailing_wide_int_storage (unsigned int, unsigned char *, HOST_WIDE_INT *);
+  trailing_wide_int_storage (unsigned int, unsigned short *, HOST_WIDE_INT *);
 
   /* The standard generic_wide_int storage methods.  */
   unsigned int get_len () const;
@@ -1762,15 +1761,13 @@ private:
   unsigned short m_precision;
 
   /* The shared maximum length of each number.  */
-  unsigned char m_max_len;
+  unsigned short m_max_len;
 
   /* The number of elements.  */
   unsigned char m_num_elements;
 
-  /* The current length of each number.
-     Avoid char array so the whole structure is not a typeless storage
-     that will, in turn, turn off TBAA on gimple, trees and RTL.  */
-  struct {unsigned char len;} m_len[N];
+  /* The current length of each number.  */
+  unsigned short m_len[N];
 
   /* The variable-length part of the structure, which always contains
      at least one HWI.  Element I starts at index I * M_MAX_LEN.  */
@@ -1791,7 +1788,7 @@ public:
 };
 
 inline trailing_wide_int_storage::
-trailing_wide_int_storage (unsigned int precision, unsigned char *len,
+trailing_wide_int_storage (unsigned int precision, unsigned short *len,
 			   HOST_WIDE_INT *val)
   : m_precision (precision), m_len (len), m_val (val)
 {
@@ -1857,7 +1854,7 @@ template <int N>
 inline trailing_wide_int
 trailing_wide_ints <N>::operator [] (unsigned int index)
 {
-  return trailing_wide_int_storage (m_precision, &m_len[index].len,
+  return trailing_wide_int_storage (m_precision, &m_len[index],
 				    &m_val[index * m_max_len]);
 }
 
@@ -1866,7 +1863,7 @@ inline typename trailing_wide_ints <N>::const_reference
 trailing_wide_ints <N>::operator [] (unsigned int index) const
 {
   return wi::storage_ref (&m_val[index * m_max_len],
-			  m_len[index].len, m_precision);
+			  m_len[index], m_precision);
 }
 
 /* Return how many extra bytes need to be added to the end of the

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-10-14  7:38 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-14  7:38 [gcc r14-4635] middle-end: Allow _BitInt(65535) [PR102989] Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).