[{"data":1,"prerenderedAt":1154},["ShallowReactive",2],{"docs-navigation:de":3,"content-page:docs:gv5KEJmabFjU3VnOeb_3upjaFIk9doypkppyXwrdSGI":267,"content-page-surround:docs:gv5KEJmabFjU3VnOeb_3upjaFIk9doypkppyXwrdSGI":1146,"i-lucide:file":1148,"i-lucide:clipboard":1152},[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":148,"updated":271,"navigation":272,"body":273,"type":1128,"id":145,"canonicalKey":146,"draft":6,"partial":6,"locale":60,"collection":1129,"navigationFile":6,"file":1130,"route":1136,"resolution":1143},"UR-08: every printable key is labelled one position too high","docs\u002Fupstream\u002Finput\u002Fkey-labels","The Controls panel names the next character in ASCII order. A control bound to K reads L. Input is correct; only the label is wrong.","2026-08-04",{"title":144},{"type":274,"children":275,"toc":1106},"root",[276,318,344,354,365,372,377,550,566,572,577,639,644,649,655,680,686,698,711,749,754,760,765,805,823,834,881,887,892,898,965,971,1074,1079,1085,1090,1095,1101],{"type":277,"tag":278,"props":279,"children":280},"element","p",{},[281,284,290,292,298,300,305,307,311,312,316],{"type":282,"value":283},"text","The Controls panel and the in-game menus name the wrong key for every binding\nthat uses a printable character. The label shows the ",{"type":277,"tag":285,"props":286,"children":287},"strong",{},[288],{"type":282,"value":289},"next character in ASCII\norder",{"type":282,"value":291},": a control bound to ",{"type":277,"tag":293,"props":294,"children":295},"code",{},[296],{"type":282,"value":297},"K",{"type":282,"value":299}," reads ",{"type":277,"tag":293,"props":301,"children":302},{},[303],{"type":282,"value":304},"L",{"type":282,"value":306},", a control bound to ",{"type":277,"tag":293,"props":308,"children":309},{},[310],{"type":282,"value":7},{"type":282,"value":299},{"type":277,"tag":293,"props":313,"children":314},{},[315],{"type":282,"value":67},{"type":282,"value":317},".",{"type":277,"tag":278,"props":319,"children":320},{},[321,323,328,330,335,337,342],{"type":282,"value":322},"Input itself is correct — the key that works is the right key and matches the\nWindows client, and the bindings on the account are fine. The defect is in the\ncode that renders a key id as text. Keys that have a name — ",{"type":277,"tag":293,"props":324,"children":325},{},[326],{"type":282,"value":327},"Up Arrow",{"type":282,"value":329},",\n",{"type":277,"tag":293,"props":331,"children":332},{},[333],{"type":282,"value":334},"Escape",{"type":282,"value":336},", ",{"type":277,"tag":293,"props":338,"children":339},{},[340],{"type":282,"value":341},"Tab",{"type":282,"value":343},", the function keys — are labelled correctly.",{"type":277,"tag":278,"props":345,"children":346},{},[347,352],{"type":277,"tag":285,"props":348,"children":349},{},[350],{"type":282,"value":351},"Fix:",{"type":282,"value":353}," low effort once the render function is found — with symbols that\nshould take minutes. Small blast radius: display text only, input handling\ndoesn't change.",{"type":277,"tag":278,"props":355,"children":356},{},[357,359,364],{"type":282,"value":358},"Build used for the measurements below: 38797,\n",{"type":277,"tag":293,"props":360,"children":361},{},[362],{"type":282,"value":363},"3229678d3fd7d2f0e309530086a614d97f02e7eeb3ca12650ababfd2eb360817",{"type":282,"value":317},{"type":277,"tag":366,"props":367,"children":369},"h2",{"id":368},"what-the-player-sees",[370],{"type":282,"value":371},"What the player sees",{"type":277,"tag":278,"props":373,"children":374},{},[375],{"type":282,"value":376},"Observed with default bindings, in Options → Control:",{"type":277,"tag":378,"props":379,"children":380},"table",{},[381,405],{"type":277,"tag":382,"props":383,"children":384},"thead",{},[385],{"type":277,"tag":386,"props":387,"children":388},"tr",{},[389,395,400],{"type":277,"tag":390,"props":391,"children":392},"th",{},[393],{"type":282,"value":394},"Action",{"type":277,"tag":390,"props":396,"children":397},{},[398],{"type":282,"value":399},"Key that works",{"type":277,"tag":390,"props":401,"children":402},{},[403],{"type":282,"value":404},"Label shown",{"type":277,"tag":406,"props":407,"children":408},"tbody",{},[409,431,451,470,490,510,529],{"type":277,"tag":386,"props":410,"children":411},{},[412,418,423],{"type":277,"tag":413,"props":414,"children":415},"td",{},[416],{"type":282,"value":417},"Panel: Open Hero",{"type":277,"tag":413,"props":419,"children":420},{},[421],{"type":282,"value":422},"H",{"type":277,"tag":413,"props":424,"children":425},{},[426],{"type":277,"tag":293,"props":427,"children":428},{},[429],{"type":282,"value":430},"I",{"type":277,"tag":386,"props":432,"children":433},{},[434,439,443],{"type":277,"tag":413,"props":435,"children":436},{},[437],{"type":282,"value":438},"Panel: Open Inventory",{"type":277,"tag":413,"props":440,"children":441},{},[442],{"type":282,"value":430},{"type":277,"tag":413,"props":444,"children":445},{},[446],{"type":277,"tag":293,"props":447,"children":448},{},[449],{"type":282,"value":450},"J",{"type":277,"tag":386,"props":452,"children":453},{},[454,459,463],{"type":277,"tag":413,"props":455,"children":456},{},[457],{"type":282,"value":458},"Panel: Open Skills and Attributes",{"type":277,"tag":413,"props":460,"children":461},{},[462],{"type":282,"value":297},{"type":277,"tag":413,"props":464,"children":465},{},[466],{"type":277,"tag":293,"props":467,"children":468},{},[469],{"type":282,"value":304},{"type":277,"tag":386,"props":471,"children":472},{},[473,478,482],{"type":277,"tag":413,"props":474,"children":475},{},[476],{"type":282,"value":477},"Panel: Open Quest Log",{"type":277,"tag":413,"props":479,"children":480},{},[481],{"type":282,"value":304},{"type":277,"tag":413,"props":483,"children":484},{},[485],{"type":277,"tag":293,"props":486,"children":487},{},[488],{"type":282,"value":489},"M",{"type":277,"tag":386,"props":491,"children":492},{},[493,498,502],{"type":277,"tag":413,"props":494,"children":495},{},[496],{"type":282,"value":497},"Panel: Open World Map",{"type":277,"tag":413,"props":499,"children":500},{},[501],{"type":282,"value":489},{"type":277,"tag":413,"props":503,"children":504},{},[505],{"type":277,"tag":293,"props":506,"children":507},{},[508],{"type":282,"value":509},"N",{"type":277,"tag":386,"props":511,"children":512},{},[513,518,522],{"type":277,"tag":413,"props":514,"children":515},{},[516],{"type":282,"value":517},"Action: Use Skill 1",{"type":277,"tag":413,"props":519,"children":520},{},[521],{"type":282,"value":7},{"type":277,"tag":413,"props":523,"children":524},{},[525],{"type":277,"tag":293,"props":526,"children":527},{},[528],{"type":282,"value":67},{"type":277,"tag":386,"props":530,"children":531},{},[532,537,542],{"type":277,"tag":413,"props":533,"children":534},{},[535],{"type":282,"value":536},"Movement: Move Forward",{"type":277,"tag":413,"props":538,"children":539},{},[540],{"type":282,"value":541},"W",{"type":277,"tag":413,"props":543,"children":544},{},[545],{"type":277,"tag":293,"props":546,"children":547},{},[548],{"type":282,"value":549},"X",{"type":277,"tag":278,"props":551,"children":552},{},[553,555,559,561,565],{"type":282,"value":554},"A player reads the menu, presses the key it names, and gets the adjacent\naction. \"Hero (I)\" opens the Inventory, because ",{"type":277,"tag":293,"props":556,"children":557},{},[558],{"type":282,"value":430},{"type":282,"value":560}," is the Inventory key, and\nthe Inventory label reads ",{"type":277,"tag":293,"props":562,"children":563},{},[564],{"type":282,"value":450},{"type":282,"value":317},{"type":277,"tag":366,"props":567,"children":569},{"id":568},"the-measurement-that-isolates-the-defect",[570],{"type":282,"value":571},"The measurement that isolates the defect",{"type":277,"tag":278,"props":573,"children":574},{},[575],{"type":282,"value":576},"One row of the Controls panel, with two keys bound to the same action:",{"type":277,"tag":378,"props":578,"children":579},{},[580,600],{"type":277,"tag":382,"props":581,"children":582},{},[583],{"type":277,"tag":386,"props":584,"children":585},{},[586,590,595],{"type":277,"tag":390,"props":587,"children":588},{},[589],{"type":282,"value":394},{"type":277,"tag":390,"props":591,"children":592},{},[593],{"type":282,"value":594},"Bound key",{"type":277,"tag":390,"props":596,"children":597},{},[598],{"type":282,"value":599},"Rendered",{"type":277,"tag":406,"props":601,"children":602},{},[603,621],{"type":277,"tag":386,"props":604,"children":605},{},[606,610,614],{"type":277,"tag":413,"props":607,"children":608},{},[609],{"type":282,"value":536},{"type":277,"tag":413,"props":611,"children":612},{},[613],{"type":282,"value":327},{"type":277,"tag":413,"props":615,"children":616},{},[617],{"type":277,"tag":293,"props":618,"children":619},{},[620],{"type":282,"value":327},{"type":277,"tag":386,"props":622,"children":623},{},[624,628,632],{"type":277,"tag":413,"props":625,"children":626},{},[627],{"type":282,"value":536},{"type":277,"tag":413,"props":629,"children":630},{},[631],{"type":282,"value":541},{"type":277,"tag":413,"props":633,"children":634},{},[635],{"type":277,"tag":293,"props":636,"children":637},{},[638],{"type":282,"value":549},{"type":277,"tag":278,"props":640,"children":641},{},[642],{"type":282,"value":643},"Same action, same binding record, same panel, same draw — and one of the two\nlabels is correct. That rules out the binding data, the stored configuration,\nthe keyboard layout, and any web-vs-Windows binding difference, because none\nof those can differ between two keys inside one record.",{"type":277,"tag":278,"props":645,"children":646},{},[647],{"type":282,"value":648},"The defect sits after the binding read, in the render step, and only for keys\nthat render as a character.",{"type":277,"tag":366,"props":650,"children":652},{"id":651},"scope",[653],{"type":282,"value":654},"Scope",{"type":277,"tag":656,"props":657,"children":658},"ul",{},[659,665,670,675],{"type":277,"tag":660,"props":661,"children":662},"li",{},[663],{"type":282,"value":664},"Letters and digits are both affected, by the same one position.",{"type":277,"tag":660,"props":666,"children":667},{},[668],{"type":282,"value":669},"Named keys are not affected. Those names come from the localized text, so a\nnumber cannot produce them.",{"type":277,"tag":660,"props":671,"children":672},{},[673],{"type":282,"value":674},"The defect is independent of the keyboard layout. We reproduced it on US\nQWERTY and on German QWERTZ, identically.",{"type":277,"tag":660,"props":676,"children":677},{},[678],{"type":282,"value":679},"The defect is independent of the host. Our host forwards key events\nunchanged, and it does not participate in the label draw.",{"type":277,"tag":366,"props":681,"children":683},{"id":682},"the-key-descriptor-table",[684],{"type":282,"value":685},"The key descriptor table",{"type":277,"tag":278,"props":687,"children":688},{},[689,691,696],{"type":282,"value":690},"The table sits at ",{"type":277,"tag":293,"props":692,"children":693},{},[694],{"type":282,"value":695},"0x1456c0",{"type":282,"value":697}," in the data segment. The records are 20 bytes:",{"type":277,"tag":699,"props":700,"children":704},"pre",{"language":701,"class":702,"tabindex":703},"c","shiki dark:dark-plus","0",[705],{"type":277,"tag":293,"props":706,"children":708},{"class":707},"language-c",[709],{"type":282,"value":710},"{ int32 id; char name[16] }\n\nid  0..43   Alt Control Shift CapsLock Escape NumLock ... ArrowUp F1..F12\nid 48..57   0..9   plus a parallel table of shifted names  ) ! @ # $ % ^ & * (\nid 65..90   A..Z   plus a parallel table of lowercase names  a..z",{"type":277,"tag":278,"props":712,"children":713},{},[714,716,721,723,728,729,734,735,740,742,747],{"type":282,"value":715},"The names are DOM ",{"type":277,"tag":293,"props":717,"children":718},{},[719],{"type":282,"value":720},"KeyboardEvent.key",{"type":282,"value":722}," values — ",{"type":277,"tag":293,"props":724,"children":725},{},[726],{"type":282,"value":727},"ArrowUp",{"type":282,"value":336},{"type":277,"tag":293,"props":730,"children":731},{},[732],{"type":282,"value":733},"PageDown",{"type":282,"value":329},{"type":277,"tag":293,"props":736,"children":737},{},[738],{"type":282,"value":739},"HangulMode",{"type":282,"value":741},", with ",{"type":277,"tag":293,"props":743,"children":744},{},[745],{"type":282,"value":746},"Unidentified",{"type":282,"value":748}," as the fallback. This is the table that\nturns a browser key event into an internal id.",{"type":277,"tag":278,"props":750,"children":751},{},[752],{"type":282,"value":753},"The contents and the order of this table are correct. The defect is not in\nthis data.",{"type":277,"tag":366,"props":755,"children":757},{"id":756},"what-we-could-not-determine",[758],{"type":282,"value":759},"What we could not determine",{"type":277,"tag":278,"props":761,"children":762},{},[763],{"type":282,"value":764},"We did not locate the function that renders the label. Two readings of the\ntable stay consistent with every observation above, and they need different\ncorrections, so we state both.",{"type":277,"tag":766,"props":767,"children":769},"info",{"title":768},"Reading 1 — the ids are ASCII+1 and the label casts the id",[770,772,777,779,784,786,791,792,797,798,803],{"type":282,"value":771},"Frame the records from ",{"type":277,"tag":293,"props":773,"children":774},{},[775],{"type":282,"value":776},"0x1456c4",{"type":282,"value":778},", with the name first and the id at ",{"type":277,"tag":293,"props":780,"children":781},{},[782],{"type":282,"value":783},"+16",{"type":282,"value":785},".\nThe printable ids are then one above ASCII: ",{"type":277,"tag":293,"props":787,"children":788},{},[789],{"type":282,"value":790},"A = 66",{"type":282,"value":336},{"type":277,"tag":293,"props":793,"children":794},{},[795],{"type":282,"value":796},"H = 73",{"type":282,"value":336},{"type":277,"tag":293,"props":799,"children":800},{},[801],{"type":282,"value":802},"0 = 49",{"type":282,"value":804},". A\ncast to a character gives the observed labels exactly.",{"type":277,"tag":766,"props":806,"children":808},{"title":807},"Reading 2 — the ids are ASCII and the render indexes one record too far",[809,810,814,816,821],{"type":282,"value":771},{"type":277,"tag":293,"props":811,"children":812},{},[813],{"type":282,"value":695},{"type":282,"value":815},", with the id first. The ids are then exactly\nASCII. A read of ",{"type":277,"tag":293,"props":817,"children":818},{},[819],{"type":282,"value":820},"name",{"type":282,"value":822}," from the following record gives the observed labels\nexactly.",{"type":277,"tag":278,"props":824,"children":825},{},[826,828,832],{"type":282,"value":827},"Both readings explain every case in this report, including why ",{"type":277,"tag":293,"props":829,"children":830},{},[831],{"type":282,"value":327},{"type":282,"value":833},"\nstays correct. With symbols and source this question is immediate; from a\nstripped module it isn't.",{"type":277,"tag":278,"props":835,"children":836},{},[837,839,844,846,851,853,857,858,863,864,868,869,874,875,879],{"type":282,"value":838},"We did establish that ",{"type":277,"tag":285,"props":840,"children":841},{},[842],{"type":282,"value":843},"function #9718",{"type":282,"value":845}," converts a key id to a character with\nno offset: ",{"type":277,"tag":293,"props":847,"children":848},{},[849],{"type":282,"value":850},"75",{"type":282,"value":852}," gives ",{"type":277,"tag":293,"props":854,"children":855},{},[856],{"type":282,"value":297},{"type":282,"value":336},{"type":277,"tag":293,"props":859,"children":860},{},[861],{"type":282,"value":862},"76",{"type":282,"value":852},{"type":277,"tag":293,"props":865,"children":866},{},[867],{"type":282,"value":304},{"type":282,"value":336},{"type":277,"tag":293,"props":870,"children":871},{},[872],{"type":282,"value":873},"48",{"type":282,"value":852},{"type":277,"tag":293,"props":876,"children":877},{},[878],{"type":282,"value":703},{"type":282,"value":880},". Many functions in\nthe module do that identical conversion as a generic one-character string\nhelper, so the conversion is not where the extra one enters.",{"type":277,"tag":366,"props":882,"children":884},{"id":883},"expected-behaviour",[885],{"type":282,"value":886},"Expected behaviour",{"type":277,"tag":278,"props":888,"children":889},{},[890],{"type":282,"value":891},"The Controls panel and the in-game menus name the key that actually triggers\nthe action — for printable keys, the way it already works for named keys.",{"type":277,"tag":366,"props":893,"children":895},{"id":894},"acceptance-criteria",[896],{"type":282,"value":897},"Acceptance criteria",{"type":277,"tag":656,"props":899,"children":900},{},[901,918,934,950,955,960],{"type":277,"tag":660,"props":902,"children":903},{},[904,906,910,912,916],{"type":282,"value":905},"\"Panel: Open Hero\" shows ",{"type":277,"tag":293,"props":907,"children":908},{},[909],{"type":282,"value":422},{"type":282,"value":911},", and ",{"type":277,"tag":293,"props":913,"children":914},{},[915],{"type":282,"value":422},{"type":282,"value":917}," opens the Hero panel.",{"type":277,"tag":660,"props":919,"children":920},{},[921,923,927,928,932],{"type":282,"value":922},"\"Action: Use Skill 1\" shows ",{"type":277,"tag":293,"props":924,"children":925},{},[926],{"type":282,"value":7},{"type":282,"value":911},{"type":277,"tag":293,"props":929,"children":930},{},[931],{"type":282,"value":7},{"type":282,"value":933}," uses skill 1.",{"type":277,"tag":660,"props":935,"children":936},{},[937,939,943,945,949],{"type":282,"value":938},"\"Movement: Move Forward\" shows ",{"type":277,"tag":293,"props":940,"children":941},{},[942],{"type":282,"value":327},{"type":282,"value":944}," and ",{"type":277,"tag":293,"props":946,"children":947},{},[948],{"type":282,"value":541},{"type":282,"value":317},{"type":277,"tag":660,"props":951,"children":952},{},[953],{"type":282,"value":954},"The result is the same on US QWERTY and on German QWERTZ.",{"type":277,"tag":660,"props":956,"children":957},{},[958],{"type":282,"value":959},"A rebind to any printable key shows that key.",{"type":277,"tag":660,"props":961,"children":962},{},[963],{"type":282,"value":964},"Named keys keep their current correct labels.",{"type":277,"tag":366,"props":966,"children":968},{"id":967},"how-to-reproduce",[969],{"type":282,"value":970},"How to reproduce",{"type":277,"tag":972,"props":973,"children":975},"steps",{"mode":974},"numbered",[976,983,988,994,1015,1021,1032,1038,1048,1054],{"type":277,"tag":977,"props":978,"children":980},"h3",{"id":979},"how-to-reproduce-open-the-panel",[981],{"type":282,"value":982},"Open the panel",{"type":277,"tag":278,"props":984,"children":985},{},[986],{"type":282,"value":987},"Log in and open Options → Control.",{"type":277,"tag":977,"props":989,"children":991},{"id":990},"how-to-reproduce-read-a-row",[992],{"type":282,"value":993},"Read a row",{"type":277,"tag":278,"props":995,"children":996},{},[997,999,1003,1005,1009,1010,1014],{"type":282,"value":998},"Select ",{"type":277,"tag":285,"props":1000,"children":1001},{},[1002],{"type":282,"value":536},{"type":282,"value":1004},". It shows ",{"type":277,"tag":293,"props":1006,"children":1007},{},[1008],{"type":282,"value":327},{"type":282,"value":944},{"type":277,"tag":293,"props":1011,"children":1012},{},[1013],{"type":282,"value":549},{"type":282,"value":317},{"type":277,"tag":977,"props":1016,"children":1018},{"id":1017},"how-to-reproduce-press-the-labelled-key",[1019],{"type":282,"value":1020},"Press the labelled key",{"type":277,"tag":278,"props":1022,"children":1023},{},[1024,1026,1030],{"type":282,"value":1025},"Press ",{"type":277,"tag":293,"props":1027,"children":1028},{},[1029],{"type":282,"value":549},{"type":282,"value":1031}," in the game. The character does not move.",{"type":277,"tag":977,"props":1033,"children":1035},{"id":1034},"how-to-reproduce-press-the-real-key",[1036],{"type":282,"value":1037},"Press the real key",{"type":277,"tag":278,"props":1039,"children":1040},{},[1041,1042,1046],{"type":282,"value":1025},{"type":277,"tag":293,"props":1043,"children":1044},{},[1045],{"type":282,"value":541},{"type":282,"value":1047},". The character moves forward.",{"type":277,"tag":977,"props":1049,"children":1051},{"id":1050},"how-to-reproduce-check-a-digit",[1052],{"type":282,"value":1053},"Check a digit",{"type":277,"tag":278,"props":1055,"children":1056},{},[1057,1058,1062,1063,1067,1069,1073],{"type":282,"value":998},{"type":277,"tag":285,"props":1059,"children":1060},{},[1061],{"type":282,"value":517},{"type":282,"value":1004},{"type":277,"tag":293,"props":1064,"children":1065},{},[1066],{"type":282,"value":67},{"type":282,"value":1068},". Skill 1 fires on ",{"type":277,"tag":293,"props":1070,"children":1071},{},[1072],{"type":282,"value":7},{"type":282,"value":317},{"type":277,"tag":278,"props":1075,"children":1076},{},[1077],{"type":282,"value":1078},"No configuration change is needed. The defect is present with default\nbindings.",{"type":277,"tag":366,"props":1080,"children":1082},{"id":1081},"method-and-its-limit",[1083],{"type":282,"value":1084},"Method, and its limit",{"type":277,"tag":278,"props":1086,"children":1087},{},[1088],{"type":282,"value":1089},"For the file-system reports we called the functions and measured the results.\nWe couldn't do that here: the label render depends on an initialised UI and\ntext subsystem, so there's no way to call it from a cold instance.",{"type":277,"tag":278,"props":1091,"children":1092},{},[1093],{"type":282,"value":1094},"What we observe directly: the rendered labels, the keys that work, and the\ncontents of the descriptor table. What we infer: which of the two readings is\nthe real one.",{"type":277,"tag":366,"props":1096,"children":1098},{"id":1097},"our-workaround-today",[1099],{"type":282,"value":1100},"Our workaround today",{"type":277,"tag":278,"props":1102,"children":1103},{},[1104],{"type":282,"value":1105},"None. A correction would need a second permanent transform, re-derived for\nevery client build — too high a price for a wrong letter on a label. We report\nthe defect and wait.",{"title":1107,"searchDepth":1108,"depth":1108,"links":1109},"",4,[1110,1112,1113,1114,1115,1116,1117,1118,1126,1127],{"id":368,"depth":1111,"text":371},2,{"id":568,"depth":1111,"text":571},{"id":651,"depth":1111,"text":654},{"id":682,"depth":1111,"text":685},{"id":756,"depth":1111,"text":759},{"id":883,"depth":1111,"text":886},{"id":894,"depth":1111,"text":897},{"id":967,"depth":1111,"text":970,"children":1119},[1120,1122,1123,1124,1125],{"id":979,"depth":1121,"text":982},3,{"id":990,"depth":1121,"text":993},{"id":1017,"depth":1121,"text":1020},{"id":1034,"depth":1121,"text":1037},{"id":1050,"depth":1121,"text":1053},{"id":1081,"depth":1111,"text":1084},{"id":1097,"depth":1111,"text":1100},"markdown","docs",{"source":1131,"path":1132,"stem":1133,"dir":1134,"extension":1135},"content","en\u002F1.docs\u002F3.upstream\u002F4.input\u002F2.key-labels.md","en\u002F1.docs\u002F3.upstream\u002F4.input\u002F2.key-labels","input","md",{"requestedPath":149,"resolvedPath":1137,"alternates":1138},"\u002Fdocs\u002Fupstream\u002Finput\u002Fkey-labels",[1139,1141],{"locale":60,"path":1137,"source":1140},"variant",{"locale":8,"path":149,"source":1142,"resolvedLocale":60},"fallback",{"requested":1144,"resolved":1145,"usedFallback":63},{"locale":8},{"locale":60},{"previous":1147,"next":1147},null,{"left":1149,"top":1149,"width":1150,"height":1150,"rotate":1149,"vFlip":6,"hFlip":6,"body":1151},0,24,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"\u002F>\u003Cpath d=\"M14 2v5a1 1 0 0 0 1 1h5\"\u002F>\u003C\u002Fg>",{"left":1149,"top":1149,"width":1150,"height":1150,"rotate":1149,"vFlip":6,"hFlip":6,"body":1153},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"8\" height=\"4\" x=\"8\" y=\"2\" rx=\"1\" ry=\"1\"\u002F>\u003Cpath d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"\u002F>\u003C\u002Fg>",1794063741927]