[{"data":1,"prerenderedAt":460},["ShallowReactive",2],{"docs-navigation:en":3,"content-page:docs:3Pe4pwVYedJYK00JNoM3MCLuhPlGLLt8YU0CpksZqr8":195,"content-page-surround:docs:3Pe4pwVYedJYK00JNoM3MCLuhPlGLLt8YU0CpksZqr8":455},[4,54,74],{"title":5,"page":6,"canonicalKey":7,"locale":8,"id":9,"draft":6,"icon":10,"sidebar":11,"children":12},"Guides",false,"1","en","content:en:1.docs:1.guides:.navigation.yml","lucide:route","section",[13,19,26,33,40,47],{"title":14,"id":15,"canonicalKey":16,"locale":8,"draft":6,"icon":17,"path":18},"Install Guild Wars on Mac","content:en:1.docs:1.guides:1.install.md","1\u002F1","lucide:download","\u002Fdocs\u002Fguides\u002Finstall",{"title":20,"id":21,"canonicalKey":22,"locale":8,"draft":6,"navigation":23,"icon":24,"path":25},"Accounts & mobile linking","content:en:1.docs:1.guides:2.accounts.md","1\u002F2",{"title":20},"lucide:key-round","\u002Fdocs\u002Fguides\u002Faccounts",{"title":27,"id":28,"canonicalKey":29,"locale":8,"draft":6,"navigation":30,"icon":31,"path":32},"Play on Mac: options","content:en:1.docs:1.guides:3.play-guild-wars-on-mac.md","1\u002F3",{"title":27},"lucide:scale","\u002Fdocs\u002Fguides\u002Fplay-guild-wars-on-mac",{"title":34,"id":35,"canonicalKey":36,"locale":8,"draft":6,"navigation":37,"icon":38,"path":39},"Performance","content:en:1.docs:1.guides:4.performance.md","1\u002F4",{"title":34},"lucide:gauge","\u002Fdocs\u002Fguides\u002Fperformance",{"title":41,"id":42,"canonicalKey":43,"locale":8,"draft":6,"navigation":44,"icon":45,"path":46},"Templates","content:en:1.docs:1.guides:5.templates.md","1\u002F5",{"title":41},"lucide:bookmark","\u002Fdocs\u002Fguides\u002Ftemplates",{"title":48,"id":49,"canonicalKey":50,"locale":8,"draft":6,"navigation":51,"icon":52,"path":53},"Troubleshooting","content:en:1.docs:1.guides:6.troubleshooting.md","1\u002F6",{"title":48},"lucide:wrench","\u002Fdocs\u002Fguides\u002Ftroubleshooting",{"title":55,"page":6,"canonicalKey":56,"locale":8,"id":57,"draft":6,"icon":58,"sidebar":59,"children":60},"Project","2","content:en:1.docs:2.project:.navigation.yml","lucide:shield-check","group",[61,67],{"title":62,"id":63,"canonicalKey":64,"locale":8,"draft":6,"navigation":65,"icon":58,"path":66},"Safety & account risk","content:en:1.docs:2.project:1.safety.md","2\u002F1",{"title":62},"\u002Fdocs\u002Fproject\u002Fsafety",{"title":68,"id":69,"canonicalKey":70,"locale":8,"draft":6,"navigation":71,"icon":72,"path":73},"About & credits","content:en:1.docs:2.project:2.about.md","2\u002F2",{"title":68},"lucide:users","\u002Fdocs\u002Fproject\u002Fabout",{"title":75,"page":6,"canonicalKey":76,"locale":8,"id":77,"draft":6,"icon":78,"sidebar":11,"children":79},"For ArenaNet","3","content:en:1.docs:3.upstream:.navigation.yml","lucide:send",[80,87,94,120,146,158,177],{"title":81,"id":82,"canonicalKey":83,"locale":8,"draft":6,"navigation":84,"icon":85,"path":86},"Introduction","content:en:1.docs:3.upstream:1.introduction.md","3\u002F1",{"title":81},"lucide:book-open-check","\u002Fdocs\u002Fupstream\u002Fintroduction",{"title":88,"id":89,"canonicalKey":90,"locale":8,"draft":6,"navigation":91,"icon":92,"path":93},"Request summary","content:en:1.docs:3.upstream:2.request-summary.md","3\u002F2",{"title":88},"lucide:list-checks","\u002Fdocs\u002Fupstream\u002Frequest-summary",{"title":95,"page":6,"canonicalKey":96,"locale":8,"id":97,"draft":6,"icon":98,"sidebar":59,"children":99},"File system","3\u002F3","content:en:1.docs:3.upstream:3.filesystem:.navigation.yml","lucide:folder-x",[100,106,113],{"title":101,"id":102,"canonicalKey":103,"locale":8,"draft":6,"navigation":104,"icon":98,"path":105},"File routines (UR-01…04)","content:en:1.docs:3.upstream:3.filesystem:1.unimplemented-routines.md","3\u002F3\u002F1",{"title":101},"\u002Fdocs\u002Fupstream\u002Ffilesystem\u002Funimplemented-routines",{"title":107,"id":108,"canonicalKey":109,"locale":8,"draft":6,"navigation":110,"icon":111,"path":112},"RemoveExtension (UR-05)","content:en:1.docs:3.upstream:3.filesystem:2.path-remove-extension.md","3\u002F3\u002F2",{"title":107},"lucide:scissors","\u002Fdocs\u002Fupstream\u002Ffilesystem\u002Fpath-remove-extension",{"title":114,"id":115,"canonicalKey":116,"locale":8,"draft":6,"navigation":117,"icon":118,"path":119},"File::Open mode (UR-06)","content:en:1.docs:3.upstream:3.filesystem:3.file-open-mode.md","3\u002F3\u002F3",{"title":114},"lucide:file-plus-2","\u002Fdocs\u002Fupstream\u002Ffilesystem\u002Ffile-open-mode",{"title":121,"page":6,"canonicalKey":122,"locale":8,"id":123,"draft":6,"icon":124,"sidebar":59,"children":125},"Input","3\u002F4","content:en:1.docs:3.upstream:4.input:.navigation.yml","lucide:mouse-pointer-click",[126,132,139],{"title":127,"id":128,"canonicalKey":129,"locale":8,"draft":6,"navigation":130,"icon":124,"path":131},"Double-click (UR-07)","content:en:1.docs:3.upstream:4.input:1.double-click-flag.md","3\u002F4\u002F1",{"title":127},"\u002Fdocs\u002Fupstream\u002Finput\u002Fdouble-click-flag",{"title":133,"id":134,"canonicalKey":135,"locale":8,"draft":6,"navigation":136,"icon":137,"path":138},"Key labels (UR-08)","content:en:1.docs:3.upstream:4.input:2.key-labels.md","3\u002F4\u002F2",{"title":133},"lucide:keyboard","\u002Fdocs\u002Fupstream\u002Finput\u002Fkey-labels",{"title":140,"id":141,"canonicalKey":142,"locale":8,"draft":6,"navigation":143,"icon":144,"path":145},"Cursor re-test (UR-09)","content:en:1.docs:3.upstream:4.input:3.cursor-re-evaluation.md","3\u002F4\u002F3",{"title":140},"lucide:pointer","\u002Fdocs\u002Fupstream\u002Finput\u002Fcursor-re-evaluation",{"title":147,"page":6,"canonicalKey":148,"locale":8,"id":149,"draft":6,"icon":150,"sidebar":59,"children":151},"Runtime","3\u002F5","content:en:1.docs:3.upstream:5.runtime:.navigation.yml","lucide:cpu",[152],{"title":153,"id":154,"canonicalKey":155,"locale":8,"draft":6,"navigation":156,"icon":150,"path":157},"Heap maximum (UR-10)","content:en:1.docs:3.upstream:5.runtime:1.heap-maximum.md","3\u002F5\u002F1",{"title":153},"\u002Fdocs\u002Fupstream\u002Fruntime\u002Fheap-maximum",{"title":159,"page":6,"canonicalKey":160,"locale":8,"id":161,"draft":6,"icon":162,"sidebar":59,"children":163},"Interface proposals","3\u002F6","content:en:1.docs:3.upstream:6.proposals:.navigation.yml","lucide:plug",[164,171],{"title":165,"id":166,"canonicalKey":167,"locale":8,"draft":6,"navigation":168,"icon":169,"path":170},"Build identity (UR-11)","content:en:1.docs:3.upstream:6.proposals:1.build-identification.md","3\u002F6\u002F1",{"title":165},"lucide:fingerprint","\u002Fdocs\u002Fupstream\u002Fproposals\u002Fbuild-identification",{"title":172,"id":173,"canonicalKey":174,"locale":8,"draft":6,"navigation":175,"icon":162,"path":176},"Host interface (UR-12)","content:en:1.docs:3.upstream:6.proposals:2.platform-host-interface.md","3\u002F6\u002F2",{"title":172},"\u002Fdocs\u002Fupstream\u002Fproposals\u002Fplatform-host-interface",{"title":178,"page":6,"canonicalKey":179,"locale":8,"id":180,"draft":6,"icon":181,"sidebar":59,"children":182},"Reference","3\u002F7","content:en:1.docs:3.upstream:7.reference:.navigation.yml","lucide:microscope",[183,189],{"title":184,"id":185,"canonicalKey":186,"locale":8,"draft":6,"navigation":187,"icon":52,"path":188},"Our workarounds","content:en:1.docs:3.upstream:7.reference:1.our-workarounds.md","3\u002F7\u002F1",{"title":184},"\u002Fdocs\u002Fupstream\u002Freference\u002Four-workarounds",{"title":190,"id":191,"canonicalKey":192,"locale":8,"draft":6,"navigation":193,"icon":181,"path":194},"Verification method","content:en:1.docs:3.upstream:7.reference:2.verification-method.md","3\u002F7\u002F2",{"title":190},"\u002Fdocs\u002Fupstream\u002Freference\u002Fverification-method",{"title":196,"ref":197,"description":198,"icon":85,"updated":199,"navigation":200,"body":201,"type":439,"id":82,"canonicalKey":83,"draft":6,"partial":6,"locale":8,"collection":440,"navigationFile":6,"file":441,"resolvedRefs":447,"route":448,"resolution":452},"Upstream requests to ArenaNet","docs\u002Fupstream\u002Fintroduction","Bug reports and two interface proposals for the Guild Wars WebAssembly client, with evidence, repro steps, acceptance criteria, and effort per request.","2026-08-04",{"title":81},{"type":202,"children":203,"toc":430},"root",[204,212,234,241,246,266,272,284,296,303,309,406,411,417],{"type":205,"tag":206,"props":207,"children":208},"element","p",{},[209],{"type":210,"value":211},"text","This section collects twelve reports for ArenaNet: ten bugs in the Guild Wars\nWebAssembly client, and two interface proposals. Each page is one report, with\nevidence, expected behaviour, acceptance criteria, and repro steps. Most of the\nbugs are small, and six of them together restore an entire feature: template\nfile management.",{"type":205,"tag":206,"props":213,"children":214},{},[215,217,224,226,232],{"type":210,"value":216},"Start with the ",{"type":205,"tag":218,"props":219,"children":221},"a",{"href":220},"$docs\u002Fupstream\u002Frequest-summary",[222],{"type":210,"value":223},"request summary",{"type":210,"value":225}," — one table,\nwith links to everything else. Each report has an identifier like ",{"type":205,"tag":227,"props":228,"children":229},"code",{},[230],{"type":210,"value":231},"UR-07",{"type":210,"value":233},"; use\nit when referring to one.",{"type":205,"tag":235,"props":236,"children":238},"h2",{"id":237},"whos-writing-this",[239],{"type":210,"value":240},"Who's writing this",{"type":205,"tag":206,"props":242,"children":243},{},[244],{"type":210,"value":245},"GWonMac is an independent open-source project: a sandboxed macOS host for\nArenaNet's official Guild Wars WebAssembly client. The host downloads the\nclient from ArenaNet, verifies it by hash, and supplies the platform services\nit asks for. It doesn't redistribute game files or automate gameplay, and the\nproject is not affiliated with ArenaNet or NCSoft.",{"type":205,"tag":206,"props":247,"children":248},{},[249,251,256,258,264],{"type":210,"value":250},"When the client misbehaves on this platform, we ship a workaround — and every\nworkaround has to be re-certified on each new client build. That's work we'd\nrather delete. ",{"type":205,"tag":218,"props":252,"children":254},{"href":253},"$docs\u002Fupstream\u002Freference\u002Four-workarounds",[255],{"type":210,"value":184},{"type":210,"value":257},"\nlists what the host does today and what each upstream fix makes unnecessary,\nand ",{"type":205,"tag":218,"props":259,"children":261},{"href":260},"$docs\u002Fupstream\u002Freference\u002Fverification-method",[262],{"type":210,"value":263},"verification method",{"type":210,"value":265},"\nexplains how we produced the evidence and where its limits are.",{"type":205,"tag":235,"props":267,"children":269},{"id":268},"how-we-identify-code",[270],{"type":210,"value":271},"How we identify code",{"type":205,"tag":206,"props":273,"children":274},{},[275,277,282],{"type":210,"value":276},"The published module is stripped and carries no function names, so we identify\na function by its index, its signature, its call sites, and its behaviour. To\nget the index, add the function import count to the local code-section index;\nfor the builds below, the import count is ",{"type":205,"tag":227,"props":278,"children":279},{},[280],{"type":210,"value":281},"219",{"type":210,"value":283},".",{"type":205,"tag":206,"props":285,"children":286},{},[287,289,294],{"type":210,"value":288},"Source attribution comes from the assertion strings in the data section. Each\none holds the original source path, for example\n",{"type":205,"tag":227,"props":290,"children":291},{},[292],{"type":210,"value":293},"..\u002F..\u002F..\u002F..\u002FBase\u002FOs\u002FEmscripten\u002FExe\u002FEmscriptenExeFile.cpp",{"type":210,"value":295},", so every report in\nthis section maps to one translation unit in ArenaNet's tree.",{"type":205,"tag":297,"props":298,"children":300},"warning",{"title":299},"Constants use padded LEB128",[301],{"type":210,"value":302},"LLVM writes relocatable constants as zero-padded, non-canonical LEB128. A byte\nsearch for the canonical encoding finds nothing — decode the instructions\ninstead. This cost us time twice.",{"type":205,"tag":235,"props":304,"children":306},{"id":305},"client-builds-examined",[307],{"type":210,"value":308},"Client builds examined",{"type":205,"tag":310,"props":311,"children":312},"table",{},[313,342],{"type":205,"tag":314,"props":315,"children":316},"thead",{},[317],{"type":205,"tag":318,"props":319,"children":320},"tr",{},[321,327,337],{"type":205,"tag":322,"props":323,"children":324},"th",{},[325],{"type":210,"value":326},"Build",{"type":205,"tag":322,"props":328,"children":329},{},[330,332],{"type":210,"value":331},"SHA-256 of ",{"type":205,"tag":227,"props":333,"children":334},{},[335],{"type":210,"value":336},"Gw.jspi.wasm",{"type":205,"tag":322,"props":338,"children":339},{},[340],{"type":210,"value":341},"Size",{"type":205,"tag":343,"props":344,"children":345},"tbody",{},[346,365,386],{"type":205,"tag":318,"props":347,"children":348},{},[349,355,360],{"type":205,"tag":350,"props":351,"children":352},"td",{},[353],{"type":210,"value":354},"38735 (1.1.7)",{"type":205,"tag":350,"props":356,"children":357},{},[358],{"type":210,"value":359},"not recorded",{"type":205,"tag":350,"props":361,"children":362},{},[363],{"type":210,"value":364},"8,196,702 bytes",{"type":205,"tag":318,"props":366,"children":367},{},[368,373,381],{"type":205,"tag":350,"props":369,"children":370},{},[371],{"type":210,"value":372},"unnamed",{"type":205,"tag":350,"props":374,"children":375},{},[376],{"type":205,"tag":227,"props":377,"children":378},{},[379],{"type":210,"value":380},"b0319704f3072d6948a66026a35af5eb0af12b48d70986783c293e7c77e98483",{"type":205,"tag":350,"props":382,"children":383},{},[384],{"type":210,"value":385},"8,194,484 bytes",{"type":205,"tag":318,"props":387,"children":388},{},[389,394,402],{"type":205,"tag":350,"props":390,"children":391},{},[392],{"type":210,"value":393},"38797",{"type":205,"tag":350,"props":395,"children":396},{},[397],{"type":205,"tag":227,"props":398,"children":399},{},[400],{"type":210,"value":401},"3229678d3fd7d2f0e309530086a614d97f02e7eeb3ca12650ababfd2eb360817",{"type":205,"tag":350,"props":403,"children":404},{},[405],{"type":210,"value":364},{"type":205,"tag":206,"props":407,"children":408},{},[409],{"type":210,"value":410},"Each report names the build used for its measurements. Function indices are\nbuild-specific; the bugs themselves are not — they reproduce on every build\nwe've examined.",{"type":205,"tag":235,"props":412,"children":414},{"id":413},"contact",[415],{"type":210,"value":416},"Contact",{"type":205,"tag":206,"props":418,"children":419},{},[420,422,428],{"type":210,"value":421},"The project repository is\n",{"type":205,"tag":218,"props":423,"children":425},{"href":424},"https:\u002F\u002Fgithub.com\u002FMat4m0\u002Fgwonmac",[426],{"type":210,"value":427},"github.com\u002FMat4m0\u002Fgwonmac",{"type":210,"value":429},". Open an issue\nthere, or contact the maintainer through the repository. We'll answer questions\nabout any measurement in this section and can supply the test scripts that\nproduce the results.",{"title":431,"searchDepth":432,"depth":432,"links":433},"",4,[434,436,437,438],{"id":237,"depth":435,"text":240},2,{"id":268,"depth":435,"text":271},{"id":305,"depth":435,"text":308},{"id":413,"depth":435,"text":416},"markdown","docs",{"source":442,"path":443,"stem":444,"dir":445,"extension":446},"content","en\u002F1.docs\u002F3.upstream\u002F1.introduction.md","en\u002F1.docs\u002F3.upstream\u002F1.introduction","upstream","md",{"$docs\u002Fupstream\u002Frequest-summary":93,"$docs\u002Fupstream\u002Freference\u002Four-workarounds":188,"$docs\u002Fupstream\u002Freference\u002Fverification-method":194},{"requestedPath":86,"resolvedPath":86,"alternates":449},[450],{"locale":8,"path":86,"source":451},"variant",{"requested":453,"resolved":454,"usedFallback":6},{"locale":8},{"locale":8},{"previous":456,"next":458},{"title":68,"id":69,"canonicalKey":70,"locale":8,"draft":6,"navigation":457,"path":73},{"title":68},{"title":88,"id":89,"canonicalKey":90,"locale":8,"draft":6,"navigation":459,"path":93},{"title":88},1786362926766]