[{"data":1,"prerenderedAt":794},["ShallowReactive",2],{"docs-navigation:de":3,"content-page:docs:v2tn6wTnBW_UoBEtcZzXEYdONrhDooDadz0ArOU7Yt8":267,"content-page-surround:docs:v2tn6wTnBW_UoBEtcZzXEYdONrhDooDadz0ArOU7Yt8":792},[4,65,85,206],{"title":5,"page":6,"canonicalKey":7,"locale":8,"id":9,"draft":6,"icon":10,"sidebar":11,"children":12},"Ableitungen",false,"1","de","content:de:1.dokumentation:1.anleitungen:.navigation.yml","lucide:route","section",[13,21,28,35,42,49,56],{"title":14,"id":15,"canonicalKey":16,"locale":8,"draft":6,"icon":17,"navigation":18,"path":20},"Guild Wars auf dem Mac installieren","content:de:1.dokumentation:1.anleitungen:1.installation.md","1\u002F1","lucide:download",{"title":19},"Install and sign in","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Finstallation",{"title":22,"id":23,"canonicalKey":24,"locale":8,"draft":6,"navigation":25,"icon":26,"path":27},"Konten & Mobile-Verknüpfung","content:de:1.dokumentation:1.anleitungen:2.konten.md","1\u002F2",{"title":22},"lucide:key-round","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fkonten",{"title":29,"id":30,"canonicalKey":31,"locale":8,"draft":6,"navigation":32,"icon":33,"path":34},"Auf dem Mac spielen: Optionen","content:de:1.dokumentation:1.anleitungen:3.guild-wars-auf-dem-mac-spielen.md","1\u002F3",{"title":29},"lucide:scale","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fguild-wars-auf-dem-mac-spielen",{"title":36,"id":37,"canonicalKey":38,"locale":8,"draft":6,"navigation":39,"icon":40,"path":41},"Leistung","content:de:1.dokumentation:1.anleitungen:4.leistung.md","1\u002F4",{"title":36},"lucide:gauge","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fleistung",{"title":43,"id":44,"canonicalKey":45,"locale":8,"draft":6,"navigation":46,"icon":47,"path":48},"Templates","content:de:1.dokumentation:1.anleitungen:5.templates.md","1\u002F5",{"title":43},"lucide:bookmark","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Ftemplates",{"title":50,"id":51,"canonicalKey":52,"locale":8,"draft":6,"navigation":53,"icon":54,"path":55},"Fehlerbehebung","content:de:1.dokumentation:1.anleitungen:6.fehlerbehebung.md","1\u002F6",{"title":50},"lucide:wrench","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Ffehlerbehebung",{"title":57,"id":58,"canonicalKey":59,"locale":60,"draft":6,"navigation":61,"icon":62,"fallback":63,"path":64},"Known issues","content:en:1.docs:1.guides:7.known-issues.md","1\u002F7","en",{"title":57},"lucide:triangle-alert",true,"\u002Fde\u002Fdokumentation\u002Fguides\u002Fknown-issues",{"title":66,"page":6,"canonicalKey":67,"locale":8,"id":68,"draft":6,"icon":69,"sidebar":70,"children":71},"Projekt","2","content:de:1.dokumentation:2.projekt:.navigation.yml","lucide:shield-check","group",[72,78],{"title":73,"id":74,"canonicalKey":75,"locale":8,"draft":6,"navigation":76,"icon":69,"path":77},"Sicherheit & Kontorisiko","content:de:1.dokumentation:2.projekt:1.sicherheit.md","2\u002F1",{"title":73},"\u002Fde\u002Fdokumentation\u002Fprojekt\u002Fsicherheit",{"title":79,"id":80,"canonicalKey":81,"locale":8,"draft":6,"navigation":82,"icon":83,"path":84},"Über & Credits","content:de:1.dokumentation:2.projekt:2.ueber.md","2\u002F2",{"title":79},"lucide:users","\u002Fde\u002Fdokumentation\u002Fprojekt\u002Fueber",{"title":86,"page":6,"canonicalKey":87,"locale":60,"id":88,"draft":6,"icon":89,"sidebar":11,"fallback":63,"children":90},"For ArenaNet","3","content:en:1.docs:3.upstream:.navigation.yml","lucide:send",[91,98,105,131,157,169,188],{"title":92,"id":93,"canonicalKey":94,"locale":60,"draft":6,"navigation":95,"icon":96,"fallback":63,"path":97},"Introduction","content:en:1.docs:3.upstream:1.introduction.md","3\u002F1",{"title":92},"lucide:book-open-check","\u002Fde\u002Fdokumentation\u002Fupstream\u002Fintroduction",{"title":99,"id":100,"canonicalKey":101,"locale":60,"draft":6,"navigation":102,"icon":103,"fallback":63,"path":104},"Request summary","content:en:1.docs:3.upstream:2.request-summary.md","3\u002F2",{"title":99},"lucide:list-checks","\u002Fde\u002Fdokumentation\u002Fupstream\u002Frequest-summary",{"title":106,"page":6,"canonicalKey":107,"locale":60,"id":108,"draft":6,"icon":109,"sidebar":70,"fallback":63,"children":110},"File system","3\u002F3","content:en:1.docs:3.upstream:3.filesystem:.navigation.yml","lucide:folder-x",[111,117,124],{"title":112,"id":113,"canonicalKey":114,"locale":60,"draft":6,"navigation":115,"icon":109,"fallback":63,"path":116},"File routines (UR-01…04)","content:en:1.docs:3.upstream:3.filesystem:1.unimplemented-routines.md","3\u002F3\u002F1",{"title":112},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Funimplemented-routines",{"title":118,"id":119,"canonicalKey":120,"locale":60,"draft":6,"navigation":121,"icon":122,"fallback":63,"path":123},"RemoveExtension (UR-05)","content:en:1.docs:3.upstream:3.filesystem:2.path-remove-extension.md","3\u002F3\u002F2",{"title":118},"lucide:scissors","\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Fpath-remove-extension",{"title":125,"id":126,"canonicalKey":127,"locale":60,"draft":6,"navigation":128,"icon":129,"fallback":63,"path":130},"File::Open mode (UR-06)","content:en:1.docs:3.upstream:3.filesystem:3.file-open-mode.md","3\u002F3\u002F3",{"title":125},"lucide:file-plus-2","\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Ffile-open-mode",{"title":132,"page":6,"canonicalKey":133,"locale":60,"id":134,"draft":6,"icon":135,"sidebar":70,"fallback":63,"children":136},"Input","3\u002F4","content:en:1.docs:3.upstream:4.input:.navigation.yml","lucide:mouse-pointer-click",[137,143,150],{"title":138,"id":139,"canonicalKey":140,"locale":60,"draft":6,"navigation":141,"icon":135,"fallback":63,"path":142},"Double-click (UR-07)","content:en:1.docs:3.upstream:4.input:1.double-click-flag.md","3\u002F4\u002F1",{"title":138},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fdouble-click-flag",{"title":144,"id":145,"canonicalKey":146,"locale":60,"draft":6,"navigation":147,"icon":148,"fallback":63,"path":149},"Key labels (UR-08)","content:en:1.docs:3.upstream:4.input:2.key-labels.md","3\u002F4\u002F2",{"title":144},"lucide:keyboard","\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fkey-labels",{"title":151,"id":152,"canonicalKey":153,"locale":60,"draft":6,"navigation":154,"icon":155,"fallback":63,"path":156},"Cursor re-test (UR-09)","content:en:1.docs:3.upstream:4.input:3.cursor-re-evaluation.md","3\u002F4\u002F3",{"title":151},"lucide:pointer","\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fcursor-re-evaluation",{"title":158,"page":6,"canonicalKey":159,"locale":60,"id":160,"draft":6,"icon":161,"sidebar":70,"fallback":63,"children":162},"Runtime","3\u002F5","content:en:1.docs:3.upstream:5.runtime:.navigation.yml","lucide:cpu",[163],{"title":164,"id":165,"canonicalKey":166,"locale":60,"draft":6,"navigation":167,"icon":161,"fallback":63,"path":168},"Heap maximum (UR-10)","content:en:1.docs:3.upstream:5.runtime:1.heap-maximum.md","3\u002F5\u002F1",{"title":164},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Fruntime\u002Fheap-maximum",{"title":170,"page":6,"canonicalKey":171,"locale":60,"id":172,"draft":6,"icon":173,"sidebar":70,"fallback":63,"children":174},"Interface proposals","3\u002F6","content:en:1.docs:3.upstream:6.proposals:.navigation.yml","lucide:plug",[175,182],{"title":176,"id":177,"canonicalKey":178,"locale":60,"draft":6,"navigation":179,"icon":180,"fallback":63,"path":181},"Build identity (UR-11)","content:en:1.docs:3.upstream:6.proposals:1.build-identification.md","3\u002F6\u002F1",{"title":176},"lucide:fingerprint","\u002Fde\u002Fdokumentation\u002Fupstream\u002Fproposals\u002Fbuild-identification",{"title":183,"id":184,"canonicalKey":185,"locale":60,"draft":6,"navigation":186,"icon":173,"fallback":63,"path":187},"Host interface (UR-12)","content:en:1.docs:3.upstream:6.proposals:2.platform-host-interface.md","3\u002F6\u002F2",{"title":183},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Fproposals\u002Fplatform-host-interface",{"title":189,"page":6,"canonicalKey":190,"locale":60,"id":191,"draft":6,"icon":192,"sidebar":70,"fallback":63,"children":193},"Reference","3\u002F7","content:en:1.docs:3.upstream:7.reference:.navigation.yml","lucide:microscope",[194,200],{"title":195,"id":196,"canonicalKey":197,"locale":60,"draft":6,"navigation":198,"icon":54,"fallback":63,"path":199},"Our workarounds","content:en:1.docs:3.upstream:7.reference:1.our-workarounds.md","3\u002F7\u002F1",{"title":195},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Freference\u002Four-workarounds",{"title":201,"id":202,"canonicalKey":203,"locale":60,"draft":6,"navigation":204,"icon":192,"fallback":63,"path":205},"Verification method","content:en:1.docs:3.upstream:7.reference:2.verification-method.md","3\u002F7\u002F2",{"title":201},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Freference\u002Fverification-method",{"title":207,"page":6,"canonicalKey":208,"locale":60,"id":209,"draft":6,"icon":210,"sidebar":11,"fallback":63,"children":211},"Features","4","content:en:1.docs:4.features:.navigation.yml","lucide:layout-grid",[212,218,225,232,239,246,253,260],{"title":213,"id":214,"canonicalKey":215,"locale":60,"draft":6,"navigation":216,"icon":83,"fallback":63,"path":217},"Accounts and launcher","content:en:1.docs:4.features:1.accounts.md","4\u002F1",{"title":213},"\u002Fde\u002Fdokumentation\u002Ffeatures\u002Faccounts",{"title":219,"id":220,"canonicalKey":221,"locale":60,"draft":6,"navigation":222,"icon":223,"fallback":63,"path":224},"Hub and Switch Character","content:en:1.docs:4.features:2.hub.md","4\u002F2",{"title":219},"lucide:search","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Fhub",{"title":226,"id":227,"canonicalKey":228,"locale":60,"draft":6,"navigation":229,"icon":230,"fallback":63,"path":231},"Travel and maps","content:en:1.docs:4.features:3.travel-and-maps.md","4\u002F3",{"title":226},"lucide:map","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Ftravel-and-maps",{"title":233,"id":234,"canonicalKey":235,"locale":60,"draft":6,"navigation":236,"icon":237,"fallback":63,"path":238},"Chat and trade","content:en:1.docs:4.features:4.chat-and-trade.md","4\u002F4",{"title":233},"lucide:messages-square","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Fchat-and-trade",{"title":240,"id":241,"canonicalKey":242,"locale":60,"draft":6,"navigation":243,"icon":244,"fallback":63,"path":245},"Inventory","content:en:1.docs:4.features:5.inventory.md","4\u002F5",{"title":240},"lucide:package","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Finventory",{"title":247,"id":248,"canonicalKey":249,"locale":60,"draft":6,"navigation":250,"icon":251,"fallback":63,"path":252},"Timers and readouts","content:en:1.docs:4.features:6.combat.md","4\u002F6",{"title":247},"lucide:timer","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Fcombat",{"title":254,"id":255,"canonicalKey":256,"locale":60,"draft":6,"navigation":257,"icon":258,"fallback":63,"path":259},"Appearance","content:en:1.docs:4.features:7.appearance.md","4\u002F7",{"title":254},"lucide:palette","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Fappearance",{"title":261,"id":262,"canonicalKey":263,"locale":60,"draft":6,"navigation":264,"icon":265,"fallback":63,"path":266},"Game files and updates","content:en:1.docs:4.features:8.game-files-and-updates.md","4\u002F8",{"title":261},"lucide:hard-drive-download","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Fgame-files-and-updates",{"title":268,"ref":269,"description":270,"icon":54,"updated":271,"navigation":272,"body":273,"type":773,"id":196,"canonicalKey":197,"draft":6,"partial":6,"locale":60,"collection":774,"navigationFile":6,"file":775,"resolvedRefs":781,"route":782,"resolution":789},"Our workarounds, and what each fix removes","docs\u002Fupstream\u002Freference\u002Four-workarounds","What GWonMac does to the client today, why each workaround exists, what it costs us per client build, and exactly what we delete after each upstream fix.","2026-08-08",{"title":195},{"type":274,"children":275,"toc":758},"root",[276,284,291,296,325,331,374,379,389,399,405,419,438,447,453,467,486,495,504,517,523,540,545,554,570,576,590,602,611,617,631,636,645,651,665,670,675,684,693,699,729,735],{"type":277,"tag":278,"props":279,"children":280},"element","p",{},[281],{"type":282,"value":283},"text","This page is everything our host does to the client today: why each workaround\nexists, what it costs per client build, and exactly what each upstream fix\nlets us delete.",{"type":277,"tag":285,"props":286,"children":288},"h2",{"id":287},"ground-rules",[289],{"type":282,"value":290},"Ground rules",{"type":277,"tag":278,"props":292,"children":293},{},[294],{"type":282,"value":295},"The downloaded artifact from ArenaNet stays canonical: we never change it on\ndisk and never redistribute it. When the client is broken on this platform,\nthe host derives a separate patched copy in memory, verifying the input by\nhash and the output by hash. If any check fails, the host serves the untouched\nofficial module — so a new client build degrades to \"the feature is missing\",\nnever to a broken client.",{"type":277,"tag":297,"props":298,"children":300},"info",{"title":299},"Three states, one decision",[301,303,309,311,316,318,323],{"type":282,"value":302},"Each build is ",{"type":277,"tag":304,"props":305,"children":306},"code",{},[307],{"type":282,"value":308},"certified",{"type":282,"value":310},", ",{"type":277,"tag":304,"props":312,"children":313},{},[314],{"type":282,"value":315},"template-only",{"type":282,"value":317},", or ",{"type":277,"tag":304,"props":319,"children":320},{},[321],{"type":282,"value":322},"uncertified",{"type":282,"value":324},", decided by one\ncomponent. A build we don't recognise runs as the plain official client, with\nevery workaround switched off.",{"type":277,"tag":285,"props":326,"children":328},{"id":327},"workaround-1-the-template-file-bridge",[329],{"type":282,"value":330},"Workaround 1 — the template file bridge",{"type":277,"tag":278,"props":332,"children":333},{},[334,340,342,347,348,353,354,359,360,365,367,372],{"type":277,"tag":335,"props":336,"children":337},"strong",{},[338],{"type":282,"value":339},"Removed by:",{"type":282,"value":341}," ",{"type":277,"tag":304,"props":343,"children":344},{},[345],{"type":282,"value":346},"UR-01",{"type":282,"value":310},{"type":277,"tag":304,"props":349,"children":350},{},[351],{"type":282,"value":352},"UR-02",{"type":282,"value":310},{"type":277,"tag":304,"props":355,"children":356},{},[357],{"type":282,"value":358},"UR-03",{"type":282,"value":310},{"type":277,"tag":304,"props":361,"children":362},{},[363],{"type":282,"value":364},"UR-04",{"type":282,"value":366},", and the probe part of\n",{"type":277,"tag":304,"props":368,"children":369},{},[370],{"type":282,"value":371},"UR-06",{"type":282,"value":373},".",{"type":277,"tag":278,"props":375,"children":376},{},[377],{"type":282,"value":378},"The host appends five forwarder functions to the module and repoints the call\nsites of the four stub routines at them. Each forwarder calls the host through\na marker value on a syscall import the module already has — no real call can\nproduce that value. The host then does the file work in the Emscripten file\nsystem: create a directory tree, list a directory, derive a relative name,\ndelete a file, and test for a file.",{"type":277,"tag":278,"props":380,"children":381},{},[382,387],{"type":277,"tag":335,"props":383,"children":384},{},[385],{"type":282,"value":386},"Cost per client build.",{"type":282,"value":388}," The five routines have to be found again, with\nproof that their callers didn't change. This part is automated: a machine\nlocates each routine by body bytes, signature, and caller set, then hashes the\ncomplete body of every caller the transform touches. If any of that changed,\nthe transform refuses to run.",{"type":277,"tag":278,"props":390,"children":391},{},[392,397],{"type":277,"tag":335,"props":393,"children":394},{},[395],{"type":282,"value":396},"Deleted after the fix:",{"type":282,"value":398}," all of it — five forwarders, five marker values,\nthe host file-system bridge, and the whole certification table for this\ntransform.",{"type":277,"tag":285,"props":400,"children":402},{"id":401},"workaround-2-the-entry-name-without-an-extension",[403],{"type":282,"value":404},"Workaround 2 — the entry name without an extension",{"type":277,"tag":278,"props":406,"children":407},{},[408,412,413,418],{"type":277,"tag":335,"props":409,"children":410},{},[411],{"type":282,"value":339},{"type":282,"value":341},{"type":277,"tag":304,"props":414,"children":415},{},[416],{"type":282,"value":417},"UR-05",{"type":282,"value":373},{"type":277,"tag":278,"props":420,"children":421},{},[422,424,429,431,436],{"type":282,"value":423},"Our bridge returns each entry name ",{"type":277,"tag":335,"props":425,"children":426},{},[427],{"type":282,"value":428},"without",{"type":282,"value":430}," its extension, so the client\ncalls ",{"type":277,"tag":304,"props":432,"children":433},{},[434],{"type":282,"value":435},"Path::RemoveExtension",{"type":282,"value":437}," on a name where the off-by-one can't fire.",{"type":277,"tag":278,"props":439,"children":440},{},[441,445],{"type":277,"tag":335,"props":442,"children":443},{},[444],{"type":282,"value":396},{"type":282,"value":446}," nothing on day one — removing an absent extension\ndoes nothing, so the workaround stays correct. It goes together with\nworkaround 1.",{"type":277,"tag":285,"props":448,"children":450},{"id":449},"workaround-3-the-double-click-flag",[451],{"type":282,"value":452},"Workaround 3 — the double-click flag",{"type":277,"tag":278,"props":454,"children":455},{},[456,460,461,466],{"type":277,"tag":335,"props":457,"children":458},{},[459],{"type":282,"value":339},{"type":282,"value":341},{"type":277,"tag":304,"props":462,"children":463},{},[464],{"type":282,"value":465},"UR-07",{"type":282,"value":373},{"type":277,"tag":278,"props":468,"children":469},{},[470,472,477,479,484],{"type":282,"value":471},"The host appends one exported mutable ",{"type":277,"tag":304,"props":473,"children":474},{},[475],{"type":282,"value":476},"i32",{"type":282,"value":478}," global to the module and splices\nthree instructions into the mousedown callback. They store the global's value\ninto the record word the client already carries to ",{"type":277,"tag":304,"props":480,"children":481},{},[482],{"type":282,"value":483},"FrMouse",{"type":282,"value":485},", and the host\nwrites the Chromium click count into that global on every trusted press. The\ntransform adds no function and moves no index or table entry.",{"type":277,"tag":278,"props":487,"children":488},{},[489,493],{"type":277,"tag":335,"props":490,"children":491},{},[492],{"type":282,"value":386},{"type":282,"value":494}," The exact body hash of the mousedown callback, plus\ntwo byte offsets. A machine re-derives this; a human confirms it.",{"type":277,"tag":278,"props":496,"children":497},{},[498,502],{"type":277,"tag":335,"props":499,"children":500},{},[501],{"type":282,"value":396},{"type":282,"value":503}," the transform, its table, and the renderer code\nthat writes the global.",{"type":277,"tag":278,"props":505,"children":506},{},[507,509,515],{"type":282,"value":508},"An earlier workaround for the same defect synthesised a pair of touch taps. It\ndelivered four clicks instead of two, so we deleted it —\n",{"type":277,"tag":510,"props":511,"children":513},"a",{"href":512},"$docs\u002Fupstream\u002Finput\u002Fdouble-click-flag",[514],{"type":282,"value":465},{"type":282,"value":516}," has the measurement.",{"type":277,"tag":285,"props":518,"children":520},{"id":519},"workaround-4-the-native-cursor",[521],{"type":282,"value":522},"Workaround 4 — the native cursor",{"type":277,"tag":278,"props":524,"children":525},{},[526,530,532,538],{"type":277,"tag":335,"props":527,"children":528},{},[529],{"type":282,"value":339},{"type":282,"value":531}," nothing today.\n",{"type":277,"tag":510,"props":533,"children":535},{"href":534},"$docs\u002Fupstream\u002Fproposals\u002Fplatform-host-interface",[536],{"type":282,"value":537},"UR-12",{"type":282,"value":539}," would remove it.",{"type":277,"tag":278,"props":541,"children":542},{},[543],{"type":282,"value":544},"The host adds a small companion component to the module. It reads the client's\ncursor state — the active art pointer, the texture chain, and the colour\nbuffer — and publishes a 32 by 32 image into a region the host allocated; the\nhost sets that image as the native cursor. The component imports no function\nand writes nothing the game owns. Every read goes through bounds-checked\npointer chases, and every chase can fail safely.",{"type":277,"tag":278,"props":546,"children":547},{},[548,552],{"type":277,"tag":335,"props":549,"children":550},{},[551],{"type":282,"value":386},{"type":282,"value":553}," Our most expensive workaround: twelve memory\naddresses and two function indices. No machine can prove a memory address, so\na human measures them on each build. Until that's done, the player gets the\nplain system pointer.",{"type":277,"tag":278,"props":555,"children":556},{},[557,568],{"type":277,"tag":335,"props":558,"children":559},{},[560,562,566],{"type":282,"value":561},"Deleted after ",{"type":277,"tag":304,"props":563,"children":564},{},[565],{"type":282,"value":537},{"type":282,"value":567},":",{"type":282,"value":569}," the twelve cursor addresses and the component's\nread path.",{"type":277,"tag":285,"props":571,"children":573},{"id":572},"workaround-5-the-pointer-replay",[574],{"type":282,"value":575},"Workaround 5 — the pointer replay",{"type":277,"tag":278,"props":577,"children":578},{},[579,583,584,589],{"type":277,"tag":335,"props":580,"children":581},{},[582],{"type":282,"value":339},{"type":282,"value":341},{"type":277,"tag":304,"props":585,"children":586},{},[587],{"type":282,"value":588},"UR-09",{"type":282,"value":373},{"type":277,"tag":278,"props":591,"children":592},{},[593,595,600],{"type":282,"value":594},"After a click that produced no cursor event, the host dispatches one synthetic\nout-and-back ",{"type":277,"tag":304,"props":596,"children":597},{},[598],{"type":282,"value":599},"mousemove",{"type":282,"value":601}," pair at the last click position; the physical pointer\ndoesn't move. It retries every 150 ms for at most 2,500 ms. The replay can't\nstart a click and can't leave the pointer at a new position. The host also\nsynthesises pointer moves while the player rotates the camera, because the\nclient steers from absolute coordinates — that path can't originate a click\neither.",{"type":277,"tag":278,"props":603,"children":604},{},[605,609],{"type":277,"tag":335,"props":606,"children":607},{},[608],{"type":282,"value":396},{"type":282,"value":610}," the whole retry path.",{"type":277,"tag":285,"props":612,"children":614},{"id":613},"workaround-6-the-heap-warning-and-safe-reload",[615],{"type":282,"value":616},"Workaround 6 — the heap warning and safe reload",{"type":277,"tag":278,"props":618,"children":619},{},[620,624,625,630],{"type":277,"tag":335,"props":621,"children":622},{},[623],{"type":282,"value":339},{"type":282,"value":341},{"type":277,"tag":304,"props":626,"children":627},{},[628],{"type":282,"value":629},"UR-10",{"type":282,"value":373},{"type":277,"tag":278,"props":632,"children":633},{},[634],{"type":282,"value":635},"The host monitors the effective heap cap, warns while the player still has\nroom to return somewhere safe, then offers a user-controlled reload. WASM\nmemory capacity cannot shrink inside one process; reload starts a new heap.",{"type":277,"tag":278,"props":637,"children":638},{},[639,643],{"type":277,"tag":335,"props":640,"children":641},{},[642],{"type":282,"value":396},{"type":282,"value":644}," emergency reload guidance can go once ArenaNet's\nownership policy is bounded and long content-diverse sessions remain well\nbelow the effective cap. The general crash-recovery path remains.",{"type":277,"tag":285,"props":646,"children":648},{"id":647},"research-profile-paired-4-gb-jswasm-transform",[649],{"type":282,"value":650},"Research profile — paired 4 GB JS\u002FWASM transform",{"type":277,"tag":278,"props":652,"children":653},{},[654,659,660,664],{"type":277,"tag":335,"props":655,"children":656},{},[657],{"type":282,"value":658},"Reduced or removed by:",{"type":282,"value":341},{"type":277,"tag":304,"props":661,"children":662},{},[663],{"type":282,"value":629},{"type":282,"value":373},{"type":277,"tag":278,"props":666,"children":667},{},[668],{"type":282,"value":669},"An off-by-default developer profile raises build 38797's WASM maximum to 4 GiB\nminus one page and transforms the matching generated JavaScript to normalize\nwasm32 pointers above 2 GiB. It is a paired transform: changing only the WASM\nmaximum would hand negative pointer values to JavaScript and is refused.",{"type":277,"tag":278,"props":671,"children":672},{},[673],{"type":282,"value":674},"The exact pair has passed ArenaNet-allocator qualification above 3 GiB and a\nlive Electron string-glue test at 2,625 MiB. It remains a research profile, not\na default player setting. All five variants the production chain can emit are\nhash-pinned. Before an experimental release it still needs packaged\nhigh-address gameplay coverage, system-memory testing, and explicit opt-in\ncopy. Diagnostics record the effective mode and cap.",{"type":277,"tag":278,"props":676,"children":677},{},[678,682],{"type":277,"tag":335,"props":679,"children":680},{},[681],{"type":282,"value":386},{"type":282,"value":683}," Both official artifact hashes, every accepted\npredecessor hash, both derived hashes, and the generated-glue pointer audit.\nAny ArenaNet update disables the profile until it is re-certified.",{"type":277,"tag":278,"props":685,"children":686},{},[687,691],{"type":277,"tag":335,"props":688,"children":689},{},[690],{"type":282,"value":396},{"type":282,"value":692}," the whole transform and its certification table. A\nsource-built 4 GB client already has the compiler's matching unsigned-pointer\nsupport; a bounded cache\u002Flifecycle fix removes the reason for our emergency\nheadroom.",{"type":277,"tag":285,"props":694,"children":696},{"id":695},"what-our-workarounds-never-do",[697],{"type":282,"value":698},"What our workarounds never do",{"type":277,"tag":700,"props":701,"children":702},"ul",{},[703,709,714,719,724],{"type":277,"tag":704,"props":705,"children":706},"li",{},[707],{"type":282,"value":708},"They never change the artifact on disk.",{"type":277,"tag":704,"props":710,"children":711},{},[712],{"type":282,"value":713},"They never redistribute game files.",{"type":277,"tag":704,"props":715,"children":716},{},[717],{"type":282,"value":718},"They never send credentials, account identifiers, or game traffic anywhere.",{"type":277,"tag":704,"props":720,"children":721},{},[722],{"type":282,"value":723},"They never automate gameplay. The host does not choose a target, move a\ncharacter, use a skill, or send chat.",{"type":277,"tag":704,"props":725,"children":726},{},[727],{"type":282,"value":728},"They never run on a build that we have not certified.",{"type":277,"tag":285,"props":730,"children":732},{"id":731},"the-bottom-line",[733],{"type":282,"value":734},"The bottom line",{"type":277,"tag":278,"props":736,"children":737},{},[738,740,744,746,750,752,756],{"type":282,"value":739},"Six of the twelve requests exist because of file handling; one exists because\nof a single unwritten byte. Fix ",{"type":277,"tag":304,"props":741,"children":742},{},[743],{"type":282,"value":346},{"type":282,"value":745}," to ",{"type":277,"tag":304,"props":747,"children":748},{},[749],{"type":282,"value":465},{"type":282,"value":751}," and three production\nworkarounds disappear outright. A source-level ",{"type":277,"tag":304,"props":753,"children":754},{},[755],{"type":282,"value":629},{"type":282,"value":757}," correction also avoids\nturning the research-only 4 GB profile into another permanent certification\nburden.",{"title":759,"searchDepth":760,"depth":760,"links":761},"",4,[762,764,765,766,767,768,769,770,771,772],{"id":287,"depth":763,"text":290},2,{"id":327,"depth":763,"text":330},{"id":401,"depth":763,"text":404},{"id":449,"depth":763,"text":452},{"id":519,"depth":763,"text":522},{"id":572,"depth":763,"text":575},{"id":613,"depth":763,"text":616},{"id":647,"depth":763,"text":650},{"id":695,"depth":763,"text":698},{"id":731,"depth":763,"text":734},"markdown","docs",{"source":776,"path":777,"stem":778,"dir":779,"extension":780},"content","en\u002F1.docs\u002F3.upstream\u002F7.reference\u002F1.our-workarounds.md","en\u002F1.docs\u002F3.upstream\u002F7.reference\u002F1.our-workarounds","reference","md",{"$docs\u002Fupstream\u002Finput\u002Fdouble-click-flag":142,"$docs\u002Fupstream\u002Fproposals\u002Fplatform-host-interface":187},{"requestedPath":199,"resolvedPath":783,"alternates":784},"\u002Fdocs\u002Fupstream\u002Freference\u002Four-workarounds",[785,787],{"locale":60,"path":783,"source":786},"variant",{"locale":8,"path":199,"source":788,"resolvedLocale":60},"fallback",{"requested":790,"resolved":791,"usedFallback":63},{"locale":8},{"locale":60},{"previous":793,"next":793},null,1794063743422]