From 913c42eb5675a2a9085bcd4dbddc698cf425b070 Mon Sep 17 00:00:00 2001 From: seedds Date: Thu, 5 Nov 2026 23:56:29 -0600 Subject: [PATCH] feat(starfox): integrate Mac graphics fixes and shader prewarm Combine upstream PRs #1304, #1305, #1308, #1310 and #1323 for a local Mac build. Credit their original authors for the display, graphics, streaming and resolution changes. Add the observed startup/tutorial prewarm list and adapt loader/display test fixtures to the current host. --- dm/games/01007EF00011E000/README.md | 2 +- dm/games/0400E88025B1A000/README.md | 26 +- dm/games/0400E88025B1A000/patches.py | 35 + dm/games/0400E88025B1A000/pso_manifest.tsv | 776 ++++++++++++++++++++- dm/games/settings.tsv | 1 + dm/gfx/hle_vi.c | 26 +- dm/gfx/nvn/hle_nvn.c | 36 +- dm/gfx/nvn/nvn_dirty.c | 17 + dm/gfx/nvn/nvn_dirty.h | 3 + dm/gfx/nvn/nvn_mtl.m | 95 ++- dm/gfx/nvn/nvn_obj.h | 4 +- dm/gfx/tests/Makefile | 3 + dm/gfx/tests/t_dirty_slots.c | 24 + dm/gfx/tests/t_image_srgb.m | 81 +++ dm/gfx/tests/t_nvn.c | 9 + dm/gfx/tests/t_readback.m | 78 +++ dm/host/hle.h | 1 + dm/host/hle_misc.c | 9 +- dm/host/hle_oe.c | 15 +- dm/host/loader.c | 6 + dm/host/probe.c | 26 +- dm/host/tests/Makefile | 5 +- dm/host/tests/t_nro.c | 1 + dm/host/tests/t_oe.c | 5 + dm/host/tests/t_pctl.c | 4 + dm/host/tests/t_symbols.c | 1 + dm/host/tests/t_vi_display.c | 29 + dm/host/tests/t_vi_display_front.c | 9 + dm/tools/docs_patches.py | 2 +- dm/tools/patch_nso.py | 6 +- docs/agents/05-debugging.md | 4 +- docs/agents/game-patches.md | 12 + docs/agents/symptoms.md | 4 + docs/env_switches.tsv | 5 + docs/reference/memory.md | 2 +- docs/reference/nvn-objects.md | 11 +- docs/reference/rendering.md | 8 + docs/reference/services.md | 16 + docs/settings.md | 7 +- 39 files changed, 1346 insertions(+), 58 deletions(-) create mode 100644 dm/games/0400E88025B1A000/patches.py create mode 100644 dm/gfx/tests/t_image_srgb.m create mode 100644 dm/host/tests/t_vi_display.c create mode 100644 dm/host/tests/t_vi_display_front.c diff --git a/dm/games/01007EF00011E000/README.md b/dm/games/01007EF00011E000/README.md index 0481064308..1db4160ce4 100644 --- a/dm/games/01007EF00011E000/README.md +++ b/dm/games/01007EF00011E000/README.md @@ -29,7 +29,7 @@ No `tex_flush_upload` (a minute's boot saw it flush 32 CPU-filled textures with - The stubs: `setWaitVsyncInterval` (`main+0x11269b8`, called once a frame at `main+0x11267c0`; the framework keeps the interval at fw+0x244, getter vtable +0x138, read by both callers of `VFR::updateInterval` and directly in 43 places, and passes it to `nvnWindowSetPresentInterval`) takes the host's step unless the VFR override (+0x29 flag, +0x2c interval) is set. `ksys::VFR::updateInterval` (`main+0x151d3d0`, x0 = the VFR at `[main+0x1e93890]`, called from `GameScene::calc` and the per-frame delegate `main+0x1280f80`) takes the framework's interval in the next frame (ratio = step / 2, base interval 2, and the int interval 16 pieces of logic read); its stub publishes the override at state +0x24 so the host holds frames that long. The step is not written into the VFR call itself, because the game presents on its own thread and the step can change between the two VFR calls of a frame. - Mac (M4 Pro), from the title into the save's scene: 1.000 of real time at 60; with 12 ms added to every frame (`DM_TEST_PRESENT_LAG=1,12`) it drops to 30 and stays at 1.000. `DM_FPS_TARGET=30` holds 30 (saves power, also from `Documents/env.txt`); `0` runs the game's own interval controller. - **Frame-step probes (iPhone).** The GPU clock follows the hold: on an iPhone the game went from 14.4 to about 25 ms of GPU time a frame at 30 fps with the same 4,900 draws, its CPU still on the performance cores, and never tried 60 again; a GPU time at the longer hold of at least 1.3 times its time at 60 that alone does not fit 60 (`nvn_fstep_gpu_slowed`) now allows probes. Stepped up by pipeline compiles after a cutscene, it took 12.8–15.2 ms of GPU time a frame at 30 fps (p50) where 60 had held for minutes, and stayed at 30 for 36 and 46 s until the player switched out and back (the same 4,900 draws took 5.8 ms right after a trip to the background and 13.5 ms half a minute later); a step up after 8 s or more at 60 now keeps that run's cost, and a cost at the longer hold of at most 1.1 times it allows a probe (`nvn_fstep_same`). Log lines: `frame step: hold 2 → 1 … (probe, …)`, `the probe held / failed`, `hold 1 held at 0.86`. Details: [development.md, Power](../../../docs/development.md#power). -- **Frame-step probes on the Mac (resolved, 2026-11-01).** An M5 Pro, fullscreen, present snapshots on, encode thread off, the host's profiler (`dm/host/sysprof.m`, `@gpu_mhz` / `@gpu_on`): at 60 fps macOS lowered the GPU clock from about 1,200 to 400 MHz over 4 s whenever the frame fit, until the frame's GPU work was about 11.7 of 16.6 ms (GPU powered 98%, occupied 70%: the game's own work after its fence wait, the first cut and segments drained faster than encoded leave 2–5 ms a frame without GPU work). A heavier scene (4,200–4,700 draws, GPU 20–27 ms at 400 MHz, 8 ms at 1,200) stepped the hold to 2 or 3 within three frames, where the GPU is occupied 55–75% and the clock fell to its floor (338 MHz); each probe back to hold 1 saw the clock rise 338 → 432 MHz and the GPU time fall 24.8 → 18.5 ms over its 33 frames, then failed, and hold 2 stayed for minutes. The probe's grace now lasts while its frames keep getting cheaper: [A probe's grace lasts while its frames keep getting cheaper](../../../docs/reference/frame-rate.md#a-probes-grace-lasts-while-its-frames-keep-getting-cheaper). The game waits on the fence of the frame it just submitted (`@sync_ms` 9.7 ms ≈ the GPU's end after the present at 400 MHz, 0 at 1,200), as on the Switch; the host's fence is the last commit's and wakes on the GPU's signal. Holding back the first segment (`DM_NVN_CUT_FIRST=ab`) only moved the GPU's start 4 ms later and lost 7 fps. With the fix (a 470 s run, `DM_FSTEP_PROBE_RAMP=ab`, encode thread on) every probe after the first 80 s held, 11 in a row, each within about a second; the probes that failed (presents 3834, 3929, 4083) were in a phase with the rule off. +- **Frame-step probes on the Mac (resolved, 2026-11-01).** An M5 Pro, fullscreen, present snapshots on, encode thread off, the host's profiler (`dm/host/sysprof.m`, `@gpu_mhz` / `@gpu_on`): at 60 fps macOS lowered the GPU clock from about 1,200 to 400 MHz over 4 s whenever the frame fit, until the frame's GPU work was about 11.7 of 16.6 ms (GPU powered 98%, occupied 70%: the game's own work after its fence wait, the first cut and segments drained faster than encoded leave 2–5 ms a frame without GPU work). A heavier scene (4,200–4,700 draws, GPU 20–27 ms at 400 MHz, 8 ms at 1,200) stepped the hold to 2 or 3 within three frames, where the GPU is occupied 55–75% and the clock fell to its floor (338 MHz); each probe back to hold 1 saw the clock rise 338 → 432 MHz and the GPU time fall 24.8 → 18.5 ms over its 33 frames, then failed, and hold 2 stayed for minutes. The probe's grace now lasts while its frames keep getting cheaper: [A probe's grace lasts while its frames keep getting cheaper](../../../docs/reference/frame-rate.md#a-probes-grace-lasts-while-its-frames-keep-getting-cheaper). The game waits on the fence of the frame it just submitted (`@sync_ms` 9.7 ms ≈ the GPU's end after the present at 400 MHz, 0 at 1,200), as on the Switch; the host's fence is the last commit's and wakes on the GPU's signal. Holding back the first segment (an A/B switch of the experiment, not kept) only moved the GPU's start 4 ms later and lost 7 fps. With the fix (a 470 s run, `DM_FSTEP_PROBE_RAMP=ab`, encode thread on) every probe after the first 80 s held, 11 in a row, each within about a second; the probes that failed (presents 3834, 3929, 4083) were in a phase with the rule off. - **Screens whose rate is not a multiple of 60 (from PR #27).** A cheap 50 ms frame shows 54.5 ms at 165 Hz; counted as late it kept the game at 20 fps for good, so the frame step lets a frame on time show one refresh longer than its hold (`shown_slack`, `nvn_fstep.h`). - **Resolved: menu repeat twice as fast at 60 fps (2026-10-26).** `sead::ControllerBase::updateDerivativeParams_` (`main+0xeb0ef0`) adds a constant 1.0 (`main+0xeb0f78`..`88`) to each held button's count and repeats when `fmod(count - delay, pulse)` falls below that step, so delays and pulses were counted in frames: holding Down in the System menu for 0.3 s went 5 entries at 60 and 2 at 30 (found by MacNativeGames, `866beb9`). A `FRAME_STEP` stub at `main+0xeb0f88` takes the VFR's ratio (`+0x3c`, interval / 2) instead, keeping 1.0 when there is no VFR or the ratio is not positive. Mac, 60 fps: 0.2 / 0.3 / 0.4 s now move 1 / 2 / 3 entries, as the game does at 30. The pause menu's fast-repeat countdown (`main+0xe67d00`) already reads the VFR's delta. - `DM_NVN_CUT` growing segments (64, 128, 256 … draws) were tried for fewer commits: the game fell from 60 to 30 fps in the same scene (GPU idle while the long last segments were encoded). diff --git a/dm/games/0400E88025B1A000/README.md b/dm/games/0400E88025B1A000/README.md index a989a64894..478a557eb0 100644 --- a/dm/games/0400E88025B1A000/README.md +++ b/dm/games/0400E88025B1A000/README.md @@ -13,7 +13,7 @@ A Switch 2 game: update v131072, SDK 21.4.4 built for the Switch 2 (`Ounce`), NV | `zip_store .zip:.metallib` | `game.tsv` | the archive's members are LZ4-compressed already | | `shader_groups /data.zip=shader` | `game.tsv` | every shader is a member of the archive | -There is no game-specific patch, and only v131072's build row: the base game, v0, has not been run. +The resolution override is gated to v131072's build ID. The base game, v0, has not been run. ## Files @@ -27,14 +27,29 @@ There is no game-specific patch, and only v131072's build row: the base game, v0 ## The picture -Every 3D target is 768x432 from the first frame of the title to the tutorial: MetalFX stands in for DLSS at 768x432 to 768x432, the game's NDSR compute networks take that to 1536x864, and the result reaches the 3840x2160 swap chain, whose top-left 1920x1080 holds the picture. The game's own defaults give the reason for the figure, not the cause: `render.dynres_min_scale_x` is 0.5 and `max` 1.0, so 768x432 is the minimum of a 1536x864 base, at 6 to 11 ms of GPU time a frame on the M4 Pro. `gpu_timestamps segment` changes nothing. Whether a console stays there too is not known. +The scene's size, measured with probes (`DM_PROBE_FP`, `DM_PROBE_POLL=as+…`): the renderer (`main+0xb447300`) takes a target and multiplies it by a scale it reads from its settings at `main+0xb4498a8`, `render.resolution_scale_console` 0.5 docked or `render.resolution_scale_handheld` 0.83. It runs DLSS at that size, as anti-aliasing (input = output: `nvnDlssNetworkResize` from `main+0xb75a440`, an output texture of that size), and its NDSR compute networks take the picture to the target. Docked, the target is the window's size (`[obj+0x400]`), or an override at `[obj+0x428]` that the window manager writes right after it reads the graphics scale: 1536x864, 0.8 of 1920x1080, at graphics scale 1. Hence 768x432 (1536x864 x 0.5). Two host answers made it small, each in a pull request of its own: the graphics scale, 1 docked where the full GPU share is 0 (#1304: 960x540), and the display's largest layer, 1920x1080 where a docked Switch 2 on a 4K screen outputs 4K (#1305: 1920x1080 on a 4K screen). Handheld it renders at 1600x900. + +**Resolution** (`DM_RESOLUTION_SCALE`, the launcher's Game's own / 75 % / 100 %) replaces that scale in both modes: `patches.py`, a stub at `main+0xb4498ac` in the back patch area (main's text is 189 MB, beyond the front area's reach: `ctx.area`), state +0xa0, offered through the `RESOLUTION_SCALE` capability of build `a7730d0f`. At 0.75 and 1.0 the game evaluates no DLSS. Measured on an M1 Pro, docked, graphics scale 0, 1080p target, 300 s from boot into the tutorial's flight: + +| Scale | Scene | Flight: frame p50 | Flight: GPU p50 / p95 | Cinematic (30 fps): GPU p50 | +|---|---|---|---|---| +| Game's own (0.5) | 960x540 | 16.7 ms | 10–11 / 15–16 ms | 22–24 ms | +| 0.75 | 1440x810 | 16.7 ms | 9–11 / 17–19 ms | 17–18 ms | +| 1.0 | 1920x1080 | 16.7 ms | 9–11 / 16–17 ms | 19 ms | + +At 1.0 Peppy's close-up (frame 3,000) shows the fur and whiskers sharply that 0.5 blurs. ## Driving it on the Mac +This fork combines upstream pull requests #1304, #1305, #1308, #1310 and #1323 for a Mac app. Its `pso_manifest.tsv` records the title, opening cinematic and flight tutorial (772 unique entries: 393 shader, 367 render-pipeline and 12 compute-pipeline rows). It does not cover the campaign. The host prepares this list before the first frame. + +On an M5 Pro with 24 GB, macOS 27.0, handheld mode and Resolution 100% give 1920x1080 scene targets. Physical DualSense steering, firing and the full-window picture were confirmed by the player. One 1,800-frame flight sample took 30.01 s (59.98 fps, no dropped presents); a longer 7,636-frame sample with new assets and diagnostic captures took 130.54 s (58.49 fps, 37 dropped presents). First-use and streaming hitches remain; this does not establish flawless campaign performance or 4K/120 fps. The raw screenshot is the whole 3840x2160 texture; the window crop selects its top-left 1920x1080 picture for display. + `python3 scripts/build_ipa_from_nsp.py --platform mac` builds the Mac shaders and the host and prints the run command. Headless, through `DM_CTL`: the title is up about 40 s after boot and `A` starts the game. The prologue cinematic follows, about 4 minutes on every run (a save holds no progress yet, and skipping it was not tried), then the tutorial's first question, about 300 s after boot: `LDown`, `A` answers no. Shots of the swap chain hold the picture in their top-left quarter. A `shot` takes about 165 ms: a hitch every few seconds in a run that takes them is the shot's. ## Found on this game +- The avatar settings present the virtual camera's picture into an NVN window of their own; the host makes it an off-screen window: [GameChat queries from the title screen (SDK 21)](../../../docs/reference/services.md#gamechat-queries-from-the-title-screen-sdk-21). - [SDK 21 socket initialization and overloads](../../../docs/reference/services.md#sdk-21-socket-initialization-and-overloads) and [Socket `Poll` and `Select` with nothing to wait on](../../../docs/reference/services.md#socket-poll-and-select-with-nothing-to-wait-on): the game's HTTP thread aborted on a failed `poll`. - [SDK 21's OutputStream on a virtual output device](../../../docs/reference/audio.md#sdk-21s-outputstream-on-a-virtual-output-device) and [SDK 21's hardware Opus decoder manager](../../../docs/reference/audio.md#sdk-21s-hardware-opus-decoder-manager): its voice and music. - [GameChat queries from the title screen (SDK 21)](../../../docs/reference/services.md#gamechat-queries-from-the-title-screen-sdk-21): a null read in `nn::chat::GetChattingUid`. @@ -47,8 +62,11 @@ Every 3D target is 768x432 from the first frame of the title to the tutorial: Me ## Open -- [The picture](#the-picture): why the 3D stays at 768x432. +- Native 120 Hz: the host has no takeover for `nn::vi::QueryDisplayCurrentRefreshRate` or `SetDisplay120HzRefreshRateCapability`. SDK 21 rejects the host's display handle, and the game's refresh queries keep their prefilled 60 Hz answer. Exposing 120 Hz still needs correct display semantics and simulation, audio, movie and input checks. No frame-rate unlock is enabled in this fork. + +- [The picture](#the-picture): 768x432 docked until #1304 and #1305 are in; the Resolution setting raises the scene above the game's own scale. - `[RED] DLSS: the game's bias mask (a reactive mask for MetalFX) is not passed on`. - The game's wake-up eventfd fails (the host refuses `nn::socket::EventFd`), so its HTTP thread polls without a wake-up; harmless offline. -- A `pso_manifest.tsv` has not been recorded; `render_cond` not tried; the later levels and combat, and iOS, not tested. +- The campaign was played through its last level, Venom 2, on a Mac (32 GB) with #1304, #1305, #1308 and #1310 in a test build. Without #1310, the GPU ran out of memory at the load of Venom 2's second part (`map_andross`), after 69 minutes of play: the residency set held 972 textures, 23.8 GB, against a recommended working set of 25.5 GB, and every upload batch after that was dropped, so the screen stayed black. Each scene change had uploaded 60 to 86 of the streamed BC7 arrays again, 4 to 5 GB in one frame. On the same route through Venom 2's first part, #1310 removed those uploads: 0 instead of 20 to 26, at about 1.4 GB each. With that build, the player got through the second part. Scripted runs did not reach it, so the memory there was not measured. +- A `pso_manifest.tsv` has not been recorded; `render_cond` not tried; iOS not tested. - Mario Kart World 1.8.0 has not been run with the camera answers changed for this game. diff --git a/dm/games/0400E88025B1A000/patches.py b/dm/games/0400E88025B1A000/patches.py new file mode 100644 index 0000000000..4e8459c50c --- /dev/null +++ b/dm/games/0400E88025B1A000/patches.py @@ -0,0 +1,35 @@ +# StarFox (0400E88025B1A000): the rewriter's patches of this game's own builds. dm/tools/patch_nso.py loads every profile's patches.py and applies those of a module's NSO build ID; +# FRAME_STEP and CAPABILITIES as described there ("Registered patches"). Patches of Nintendo SDK module builds are in dm/tools/sdk_patches.py +from nso_asm import ADRP, B + +# Resolution scale (state +0xa0, a float the loader writes from DM_RESOLUTION_SCALE; 0 = the game's own). The renderer (main+0xb447300) sizes its scene each frame as its target +# (1920x1080 at graphics scale 0) times a scale it reads from its settings at main+0xb4498a8: render.resolution_scale_console docked (0.5) or render.resolution_scale_handheld +# (0.83), and runs DLSS at that size, as anti-aliasing; its own upscaler (NDSR) then takes the picture to the target. The stub replaces the value read, the load at main+0xb4498ac, +# when the state holds one: the rest (a near-zero value falls back to render.resolution_scale, the minimum with the benchmark scale, GameShare's scales) runs as before. x9, s1 +# and the flags are dead there: main+0xb4498b4, +0xb4498b8 and +0xb4498bc set them. With 0 every instruction the game runs is its own +def frame_step(ctx): + here, emit, site, put, state = ctx.here, ctx.emit, ctx.site, ctx.put, ctx.state + site(0xb4498ac, 'e0a343bd') # ldr s0,[sp,#0x3a0]: the scale read from the settings + ctx.area(0xb4498ac) # main's text is 189 MB: the back patch area reaches the site + start = here() + emit(0xbd43a3e0) # ldr s0,[sp,#0x3a0] (original) + emit(ADRP(9, here(), state)) + for w in (0xbd40a121, # ldr s1,[x9,#0xa0] the host's scale + 0x1e202028, # fcmp s1,#0.0 + 0x5400004d, # b.le done (+8) 0: the game's own + 0x1e204020): # fmov s0,s1 + emit(w) + emit(B(here(), 0xb4498b0)) # done + put(0xb4498ac, [B(0xb4498ac, start)], 'scene resolution scale from the host (DM_RESOLUTION_SCALE; 0 = the game\'s own)') + +FRAME_STEP = {'a7730d0f74d168d90422354c8317f76f': frame_step} +# The launcher offers DM_RESOLUTION_SCALE (dm/games/settings.tsv) only for this build +CAPABILITIES = {'a7730d0f74d168d90422354c8317f76f': ('RESOLUTION_SCALE',)} + +# How general each patch is and could be (dm/tools/docs_patches.py "Binding", listed in docs/agents/game-patches.md): what, its binding now, the loosest it could have (goal), +# purpose, why; blocked or kept: why the gap stays open (cannot close yet, or left open on purpose); checked: what was checked on game files (else a judgement) +BINDING = [ + {'what': 'scene resolution scale', 'now': 'build', 'goal': 'game', 'purpose': 'rendering', + 'why': "the game's own settings read in its renderer", + 'blocked': 'frame-step stubs have no function-matched form yet'}, +] diff --git a/dm/games/0400E88025B1A000/pso_manifest.tsv b/dm/games/0400E88025B1A000/pso_manifest.tsv index 4620515f10..95a085896f 100644 --- a/dm/games/0400E88025B1A000/pso_manifest.tsv +++ b/dm/games/0400E88025B1A000/pso_manifest.tsv @@ -1,2 +1,774 @@ -# Prewarm seed list (shipped in the app, next to shader_map.tsv). Rows: Sshader keystage / Rrender pipeline key (pso_skey hex) / Ccompute shader key. -# Provisional profile: empty until recorded on the Mac (DM_PSO_MANIFEST=off DM_PSO_RECORD). +# Star Fox v131072: title, opening cinematic and flight tutorial on macOS. +# Recorded from physical controller play at handheld native 1920x1080; later levels are not covered. +S 7fe1717b163564d7_b 5 +S 4ba1966203a4f77b_b 0 +S 62f358694640f6de_b 0 +S 66a6b1d75f849d8c_b 1 +S db200a1b53fd6fef_b 0 +S 4c59eab22474ab59_b 1 +S 55a881cc822cd89a_b 1 +S abef20ad0d9a9b12_b 5 +S b9a97ba035dd8a72_b 1 +S 085c6fddc9443e70_b 5 +S 401877446d25d079_b 1 +S 60f3f31a0e0132e1_b 5 +S 725bcf5c3f4bb3f3_b 5 +S 3fe6b091bb8c40ce_b 5 +S 30d8ee33de9dee85_b 5 +S e97e43383ed843b6_b 5 +S e2a63ab95b10951f_b 5 +S 4acef5afefba098b_b 5 +S 36a764abe55baff2_b 5 +C 36a764abe55baff2_b +S 589170d45ba32c2b_b 5 +C 589170d45ba32c2b_b +S 21c5500ba6d9957f_b 0 +S e21c0737c789e6a1_b 1 +R 323163353530306261366439393537665f62000000000000653231633037333763373839653661315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010080482040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 9a8fcf70c76b3042_b 1 +S 49587203c03f9082_b 1 +S fc5fe7adc8c58250_b 5 +S 3ed1111fff79a0ca_b 0 +S de9c6a0c3d43d336_b 1 +S d0f52a3f08b4e0e3_b 1 +S acf25e164c450edf_b 1 +S a59e42bbbc6c2c36_b 1 +S cda489a8d523ac68_b 1 +R 323163353530306261366439393537665f62000000000000396138666366373063373662333034325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 323163353530306261366439393537665f62000000000000343935383732303363303366393038325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000050101086040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +C fc5fe7adc8c58250_b +R 336564313131316666663739613063615f62000000000000646539633661306333643433643333365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000643066353261336630386234653065335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000616366323565313634633435306564665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000613539653432626262633663326333365f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000006e00000000000000000000000000000000000000000000000000000000000000000000000100000000000000ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000636461343839613864353233616336385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S c1b8edc09e3313b1_b 5 +S 546f2576bcc31ca8_b 5 +S c78798281d3519c1_b 5 +S 73dec8e0f4095331_b 5 +S f87592cca6a9dd17_b 5 +S 0253bd17deceee79_b 5 +S 9cf7c6a5b13c4f4c_b 5 +S 146dd61797af358c_b 5 +S ed14e3f40334f815_b 5 +S 96d0599558bcf9a1_b 5 +S 194c7b2c00e198ce_b 5 +S 85889d37a8aae69c_b 5 +S 8240f7ea4417209d_b 1 +S 8cdef8a0ae929f89_b 1 +S fee64f095bc208b4_b 1 +S 285606eee552167f_b 1 +S 5ace99fb44374d8b_b 1 +S 3049a07681b36602_b 1 +S 30d24ab6ef19efca_b 1 +S bce14e89a15c878c_b 1 +S e177b114d2b03edb_b 1 +S dd2272d769e45c75_b 1 +S 60360f7eb16e5974_b 1 +S 33cc90c9d4be52c1_b 5 +S 1b7f33c3ad5dea07_b 1 +S 23f5efb036c968a3_b 1 +S 8908917bf36c2667_b 1 +S e1977db37fb3df29_b 0 +S ddc729bcdb4c8df9_b 5 +S 0db8107e10a12080_b 1 +S c48e577e0272c902_b 1 +S 196dfe02185a7518_b 5 +S e68eb27b82d4f702_b 1 +S c7b809441affae98_b 1 +S 35ebccc529cc58a9_b 1 +S f2d6c5cfbdcf3f71_b 5 +S 5afa99dc7eb25b2a_b 1 +S 0f8b241fa4de4a87_b 5 +S 4e61400f35e90614_b 1 +S 7f15edb944751969_b 5 +S 28b9835f92464cde_b 1 +S b5db079b7a2f6987_b 5 +S 7d733496906d56bc_b 5 +S f622daf33b9988ea_b 5 +S da3b5dda39a9f8b3_b 5 +S b6b7070116bd27cc_b 5 +S 4d40d522b508ec29_b 1 +S 59114be54b1252bb_b 1 +S 4533f6471ae13c36_b 1 +S 2f0ac3a542fcb18f_b 0 +S bd2f3aab0624be83_b 0 +S 6abfc9870999cb0b_b 0 +S 892e7d420b11674c_b 1 +S 825399c4a85dc81c_b 1 +S 7eb4c57da135fc7b_b 1 +S c29fb98ea6721c2a_b 1 +S d8acf1ce4100129a_b 0 +S d5597965d6df6eac_b 0 +S 000304ca638f284f_b 0 +S f89b0724654aadf8_b 1 +S 82a08fb84b3bcd5a_b 1 +S 96d2d5e5e23fbc77_b 1 +S 72eafe4be9b730cc_b 1 +S e574ebd65fe0f4b8_b 1 +S 5e1356cfb90b5856_b 0 +S fd45c7d001e004e9_b 0 +S 3f5fadf8cc0b6f04_b 0 +S f271777e3f0e31b6_b 1 +S a3b5d608e52139ed_b 1 +S 74d2c37a445512b0_b 1 +S d7ed4811e725837e_b 0 +S 4ef187a92d0f337b_b 5 +S d8004f4f16e15719_b 5 +S 8e747cc7689d1519_b 5 +C 7fe1717b163564d7_b +S 08324eb8b7badfac_b 1 +S a24aa4c63498e731_b 0 +S b449eb5859cbea6a_b 1 +R 323163353530306261366439393537665f62000000000000396138666366373063373662333034325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 323163353530306261366439393537665f62000000000000303833323465623862376261646661635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613234616134633633343938653733315f62000000000000623434396562353835396362656136615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 36a74372d8ba334f_b 0 +S 59aaa3818d295d9a_b 1 +R 333661373433373264386261333334665f62000000000000353961616133383138643239356439615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S a78f86ef4cd32908_b 0 +S c4b898302ad5854f_b 1 +S 8b15d0678323bd4e_b 0 +S 787b5f39029fc079_b 1 +S 7a2f1f84181b6771_b 0 +S bf9b868c04d4dbe3_b 1 +S e61abbc4ea90b592_b 1 +S 6169b6d51ec37abc_b 0 +S 67e52c69db2f0fbe_b 1 +S addc0a1ae6a278ae_b 1 +R 613738663836656634636433323930385f62000000000000633462383938333032616435383534665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000373837623566333930323966633037395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376132663166383431383162363737315f62000000000000626639623836386330346434646265335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800002920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376132663166383431383162363737315f62000000000000653631616262633465613930623539325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010080482040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800002920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 643535393739363564366466366561635f62000000000000316237663333633361643564656130375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 643535393739363564366466366561635f62000000000000383261303866623834623362636435615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 653139373764623337666233646632395f62000000000000393664326435653565323366626337375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010080482040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 653139373764623337666233646632395f62000000000000306462383130376531306131323038305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010080482040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 363136396236643531656333376162635f62000000000000363765353263363964623266306662655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010080482040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613234616134633633343938653733315f62000000000000616464633061316165366132373861655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S ce924739bfff4106_b 5 +R 333661373433373264386261333334665f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 30cb87709f91dd10_b 1 +S 2e945ae2160fed37_b 0 +S bc05d3b31631ceb8_b 1 +S 4decbb12dd6ae275_b 0 +S d1803be7c30e1d27_b 1 +S 108232cfc43775ad_b 0 +S 3dd9ffc96fa87b81_b 1 +S 1002069a331ceded_b 5 +S e00483a4b5a488fe_b 5 +S 8f94a8535235ff32_b 1 +S 0a6e1ca6d52ce84e_b 0 +S e2db0232c926db49_b 1 +S 4f2ed58c9653dd03_b 0 +S 2b8a20daf1940b12_b 1 +S 83bb93696b681fb5_b 1 +S 1cf2abd6b296f95b_b 0 +S ad184017a96e55be_b 1 +S 80338d4e8a6f6fa5_b 1 +S 3d75a86d778c263e_b 1 +S 2af7c69952afd35f_b 1 +S fd9a65922ccccac6_b 1 +S 67c6d1cb9f5fc1a9_b 0 +S 82150e603c185474_b 1 +S 136b12dfc414a534_b 0 +S f5fa62ac6d2c00f2_b 1 +S bb1070d092b118cf_b 1 +R 613738663836656634636433323930385f62000000000000333063623837373039663931646431305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000626330356433623331363331636562385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 333661373433373264386261333334665f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613738663836656634636433323930385f62000000000000333063623837373039663931646431305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000626330356433623331363331636562385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 346465636262313264643661653237355f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000643138303362653763333065316432375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000353961616133383138643239356439615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313038323332636663343337373561645f62000000000000336464396666633936666138376238315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +C 96d0599558bcf9a1_b +C b5db079b7a2f6987_b +C ce924739bfff4106_b +C 194c7b2c00e198ce_b +C 85889d37a8aae69c_b +C 1002069a331ceded_b +C e00483a4b5a488fe_b +R 326539343561653231363066656433375f62000000000000386639346138353335323335666633325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 306136653163613664353263653834655f62000000000000653264623032333263393236646234395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 346632656435386339363533646430335f62000000000000326238613230646166313934306231325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000383362623933363936623638316662355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 316366326162643662323936663935625f62000000000000616431383430313761393665353562655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000383033333864346538613666366661355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000336437356138366437373863323633655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000346434306435323262353038656332395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000383234306637656134343137323039645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000386364656638613061653932396638395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000343533336636343731616531336333365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000666565363466303935626332303862345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613738663836656634636433323930385f62000000000000326166376336393935326166643335665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000666439613635393232636363636163365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000383235333939633461383564633831635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000626365313465383961313563383738635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000376562346335376461313335666337625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000653137376231313464326230336564625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000633239666239386561363732316332615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000646432323732643736396534356337355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 363763366431636239663566633161395f62000000000000383231353065363033633138353437345f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313336623132646663343134613533345f62000000000000663566613632616336643263303066325f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000626231303730643039326231313863665f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 2b2d775768a1d1b3_b 0 +S e89390ac6b043e84_b 1 +R 326232643737353736386131643162335f62000000000000653839333930616336623034336538345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000260c000000000000161800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S e5966ca32079dd53_b 0 +S a6f5a44d6022e6ba_b 1 +S 35453d6b4bb4743a_b 0 +S 696d5a205185f8a5_b 1 +R 653539363663613332303739646435335f62000000000000613666356134346436303232653662615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 333534353364366234626234373433615f62000000000000363936643561323035313835663861355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010080482040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000000000000161800002920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 2f7c68f10b25018f_b 0 +S 6f51d659db84418a_b 1 +R 326637633638663130623235303138665f62000000000000366635316436353964623834343138615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S b36952139cb34eec_b 0 +R 623336393532313339636233346565635f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000002500000827000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623336393532313339636233346565635f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000002500000827000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623336393532313339636233346565635f62000000000000353961616133383138643239356439615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000002500000827000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 157d380231510252_b 0 +S 767cc67b98c64a0e_b 1 +S 659c1e02d367fa76_b 0 +S e70f7236e0b06280_b 1 +S b6e165bc24cb581d_b 0 +S b01b6aed5030e48e_b 1 +S cc2de495b90ddf70_b 1 +S fc683ea141012c12_b 1 +S 0396b3632ac7ea61_b 1 +S 0b30a4b1d6758b6b_b 1 +R 313537643338303233313531303235325f62000000000000373637636336376239386336346130655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 363539633165303264333637666137365f62000000000000653730663732333665306230363238305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000623031623661656435303330653438655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 363539633165303264333637666137365f62000000000000636332646534393562393064646637305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000666336383365613134313031326331325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313537643338303233313531303235325f62000000000000303339366233363332616337656136315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000306233306134623164363735386236625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313038323332636663343337373561645f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000653537346562643635666530663462385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 39c36f50498b89ff_b 1 +R 386231356430363738333233626434655f62000000000000333963333666353034393862383966665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 69bf3ebafe2596ed_b 1 +S 384875bf066eb593_b 1 +S fc3ef37241cf7c6c_b 1 +S c7f7a78d4f5f8958_b 0 +S ffd8a1ac0a85cb1f_b 1 +S 7b8ea38df706a7ca_b 0 +S a16db1ae57c5fec5_b 1 +R 386231356430363738333233626434655f62000000000000363962663365626166653235393665645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000333834383735626630363665623539335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000666333656633373234316366376336635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 633766376137386434663566383935385f62000000000000666664386131616330613835636231665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800002920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376238656133386466373036613763615f62000000000000613136646231616535376335666563355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000260c000029100000161800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303030333034636136333866323834665f62000000000000323366356566623033366339363861335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303030333034636136333866323834665f62000000000000663839623037323436353461616466385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303030333034636136333866323834665f62000000000000383930383931376266333663323636375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000386639346138353335323335666633325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S edaa052dd6a5726b_b 0 +S ae88a0f7a390c565_b 1 +S 07ef72e1a5acef4e_b 1 +S 7dd51f8dc6592222_b 1 +R 656461613035326464366135373236625f62000000000000616538386130663761333930633536355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000002500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 656461613035326464366135373236625f62000000000000303765663732653161356163656634655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000002500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 656461613035326464366135373236625f62000000000000376464353166386463363539323232325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000002500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000386639346138353335323335666633325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000666439613635393232636363636163365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000386639346138353335323335666633325f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S da96f93880302330_b 0 +S 9232e4b91e74500b_b 1 +R 646139366639333838303330323333305f62000000000000393233326534623931653734353030625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 3b912122f15c71bb_b 1 +R 623665313635626332346362353831645f62000000000000336239313231323266313563373162625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 2a9016e02b42f14d_b 1 +R 623665313635626332346362353831645f62000000000000326139303136653032623432663134645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 62a558dd906e4c1e_b 0 +S 4f15a7cb38777acf_b 1 +R 363261353538646439303665346331655f62000000000000346631356137636233383737376163665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 6ef6ca54c7d1cd32_b 1 +R 326539343561653231363066656433375f62000000000000366566366361353463376431636433325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 233220367be79a2a_b 0 +S e806cc9668c6fd71_b 1 +R 323333323230333637626537396132615f62000000000000653830366363393636386336666437315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000626330356433623331363331636562385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000643138303362653763333065316432375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 91a4529963ac26f2_b 1 +S dfb17cb6b73e3662_b 1 +S 9507f8e68c553d04_b 1 +R 313537643338303233313531303235325f62000000000000393161343532393936336163323666325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000646662313763623662373365333636325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000336437356138366437373863323633655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313537643338303233313531303235325f62000000000000393530376638653638633535336430345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 7f62c7365c44ca42_b 1 +R 613234616134633633343938653733315f62000000000000376636326337333635633434636134325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613234616134633633343938653733315f62000000000000623434396562353835396362656136615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010080282040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S e91faf92301c0270_b 0 +R 653931666166393233303163303237305f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 93e8069dc0c593c5_b 0 +S a9e3b2dc56303732_b 1 +S 1069fad8adcfdf0b_b 1 +S d749d8430e1f616c_b 1 +S 4eff9e9e3a8c1845_b 1 +S a0196d05bb4ac9e7_b 1 +S 8351472964d4a947_b 1 +S 59e73385fadaed6e_b 0 +S 02a61696dd7e2e59_b 1 +S 4ff2ba10a94f326a_b 1 +S 2bc6e68d30c47a37_b 1 +S 6f80e9d629736986_b 0 +S 570936fef01acdec_b 1 +S 0fc9a7c6142935ec_b 1 +S d69550a6c6e14e47_b 0 +S 50cb3468ce886f47_b 1 +S 424ef8b2910973e6_b 0 +S 318e7c69042f6d08_b 0 +S 624a1c4cde8fb748_b 1 +S 16a6ce2912771b8b_b 0 +S 7adf871fda7b6cb1_b 1 +S de7e3f08620591f0_b 0 +S d1458973934b83a0_b 1 +S bf34392bf1ff38cb_b 1 +S c18d96d064467116_b 0 +S 65361c97b42404eb_b 1 +S 60e8bd1b5de78bf1_b 1 +R 393365383036396463306335393363355f62000000000000613965336232646335363330333733325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000313036396661643861646366646630625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 393365383036396463306335393363355f62000000000000643734396438343330653166363136635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000346566663965396533613863313834355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613738663836656634636433323930385f62000000000000613031393664303562623461633965375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000383335313437323936346434613934375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 353965373333383566616461656436655f62000000000000303261363136393664643765326535395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000346666326261313061393466333236615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000326263366536386433306334376133375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 366638306539643632393733363938365f62000000000000353730393336666566303161636465635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 653931666166393233303163303237305f62000000000000306663396137633631343239333565635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 643639353530613663366531346534375f62000000000000353063623334363863653838366634375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 343234656638623239313039373365365f62000000000000353961616133383138643239356439615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 333138653763363930343266366430385f62000000000000363234613163346364653866623734385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313661366365323931323737316238625f62000000000000376164663837316664613762366362315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 646537653366303836323035393166305f62000000000000643134353839373339333462383361305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000626633343339326266316666333863625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 633138643936643036343436373131365f62000000000000363533363163393762343234303465625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000002500000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000363065386264316235646537386266315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 653931666166393233303163303237305f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S dadd339cd66efeca_b 1 +R 623665313635626332346362353831645f62000000000000646164643333396364363665666563615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 50a10145c69c0bad_b 1 +R 646139366639333838303330323333305f62000000000000353061313031343563363963306261645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S e330282b8855d20a_b 1 +R 646139366639333838303330323333305f62000000000000653333303238326238383535643230615f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 323163353530306261366439393537665f62000000000000396138666366373063373662333034325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f0000000000000010080282040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S bfbd1cc5caff0ad2_b 0 +S 855a3ca559edf80d_b 1 +R 626662643163633563616666306164325f62000000000000383535613363613535396564663830645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 305c33245df2340b_b 1 +S a3abdb0a43e0eda5_b 1 +S 6d37304dfac0480d_b 1 +R 626662643163633563616666306164325f62000000000000333035633333323435646632333430625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613738663836656634636433323930385f62000000000000613361626462306134336530656461355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000366433373330346466616330343830645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000182500002027000028000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000040000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S c58d2ce5215b637c_b 0 +S b353b3c7986b5672_b 1 +R 633538643263653532313562363337635f62000000000000623335336233633739383662353637325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000001608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S afd2634e614fadab_b 1 +R 376132663166383431383162363737315f62000000000000616664323633346536313466616461625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010080482040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800002920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S ca2248a64f5ed40b_b 1 +R 376132663166383431383162363737315f62000000000000636132323438613634663565643430625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800002920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 4b21236b759d71bb_b 1 +R 376132663166383431383162363737315f62000000000000346232313233366237353964373162625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800002920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S bec91d5904f535bd_b 0 +S ae7ae12f1f3ddb01_b 1 +R 626563393164353930346635333562645f62000000000000616537616531326631663364646230315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 76ce04293f3517f0_b 1 +S af3bd5d547f948d4_b 1 +S 3061cafe576065a9_b 1 +S 833343c5a4c8ff9a_b 1 +S 06b0ee48576a7683_b 1 +R 326539343561653231363066656433375f62000000000000373663653034323933663335313766305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 626563393164353930346635333562645f62000000000000616633626435643534376639343864345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000333036316361666535373630363561395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 626563393164353930346635333562645f62000000000000383333333433633561346338666639615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000303662306565343835373661373638335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S b7310ace7aff201c_b 1 +R 633766376137386434663566383935385f62000000000000623733313061636537616666323031635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800002920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 4fa6cdf5bf4aec2d_b 1 +R 376132663166383431383162363737315f62000000000000346661366364663562663461656332645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800002920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S fa165eaca0b663d7_b 0 +S 432db818b9fb6ad3_b 1 +R 666131363565616361306236363364375f62000000000000343332646238313862396662366164335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000260c000029100000161800002920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 48b6a1d0c655b62b_b 1 +R 393365383036396463306335393363355f62000000000000343862366131643063363535623632625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 0232dd38cb388198_b 0 +S 2caae04fe67ebd91_b 1 +R 303233326464333863623338383139385f62000000000000326361616530346665363765626439315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000002500000800000000290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 9e8c56f2d3a45d7a_b 1 +R 303233326464333863623338383139385f62000000000000396538633536663264336134356437615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000002500000800000000290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 6726949abcc0f00b_b 1 +R 303233326464333863623338383139385f62000000000000363732363934396162636330663030625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0000002500000800000000290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S a2a659c6075f4452_b 0 +S 13c7cbd673976417_b 1 +R 613261363539633630373566343435325f62000000000000313363376362643637333937363431375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S e4e2ac5b8ad1ff8c_b 0 +S d49c0c0e0aab125c_b 1 +S 7dc28ce5f20ebca4_b 0 +S e8013b103e4d247d_b 1 +S 016f4c34c81c9681_b 1 +R 653465326163356238616431666638635f62000000000000643439633063306530616162313235635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376463323863653566323065626361345f62000000000000653830313362313033653464323437645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 633766376137386434663566383935385f62000000000000303136663463333463383163393638315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800002920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S f28d96570448a262_b 1 +R 646139366639333838303330323333305f62000000000000663238643936353730343438613236325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010080482040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 0aad05dc7e65ea4a_b 0 +S 1e78aee7e0f68d6c_b 1 +S 1d813158fa1f76e9_b 1 +S 20c32c8a7bfdc121_b 1 +R 306161643035646337653635656134615f62000000000000316537386165653765306636386436635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b000010290000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 646139366639333838303330323333305f62000000000000316438313331353866613166373665395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376132663166383431383162363737315f62000000000000323063333263386137626664633132315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800002920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S a2afe373557a60e6_b 0 +S 483ee65328ba0f35_b 1 +R 613261666533373335353761363065365f62000000000000343833656536353332386261306633355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010080282040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000000000000161800002920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 70ccf487031ff59c_b 1 +R 646139366639333838303330323333305f62000000000000373063636634383730333166663539635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f0000000000000010080482040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000029100000161800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 001f9af736f68b2b_b 5 +S fdfa43f3bdf8b326_b 5 +S 833e5f40fd4ffcd3_b 5 +S ee5847094b99463c_b 5 +S 924675105c0c8e35_b 5 +S b83435b686786a53_b 5 +S 1444adc721a36911_b 5 +S 46a481b5411abb7f_b 5 +S ff01a697099e8b19_b 5 +S ecc791bcf8025e79_b 5 +S aba81e47cc4823ff_b 5 +S 298d24d7f464fa08_b 5 +S d35ce4e5edce1bec_b 5 +S 840a3059521190b9_b 5 +S da0ca61f572640fa_b 5 +S 645990920c6dfd2c_b 5 +S 829f5dfe4cac1cca_b 5 +S dfa74a59d4f439df_b 5 +S 5399046b06aaa965_b 5 +S 6a0c622c9707cd3a_b 5 +S f5746f9f5acd8156_b 5 +S 918440b764d4dd4d_b 5 +S 1f5eeb73e8c2cacf_b 5 +S 16b29eb738ce9c4d_b 5 +S c8530778849e3f7d_b 5 +S 35d129f6fed93b95_b 5 +S c08d13b58cc75db1_b 5 +S e82a8354ae8612ae_b 5 +S 7b91416776afec17_b 5 +S 1b5a7bb58f463a38_b 5 +S fe654dc475b89507_b 5 +S 19e3594a2a9ced11_b 5 +S a607e04befaf3ca3_b 5 +S 4a25e06ead45c85a_b 5 +S 42757751be255eb6_b 5 +S 061cb626d87fc55c_b 5 +S bf7a2d0bfb9fe076_b 5 +S 514fb275efadddc7_b 5 +S e9a862d8e20d6257_b 5 +S 324fcd7b32d855bf_b 5 +S 7b5f6ea94dc2a160_b 5 +S 8f650decc29fef33_b 5 +S 7b3e982e72f0ca58_b 5 +S d6dc8b4e8be3574a_b 5 +S c8fe658faf0f2dce_b 5 +S 6b7ae9d84bec100a_b 5 +S 6432f6af90c86bcc_b 5 +S e956afd7b7569f14_b 5 +S fccb459887d69e18_b 5 +S caa8064119118efc_b 5 +S 553cdc0e142fa704_b 5 +S 0df1b1fa1b83878f_b 5 +S c4e0fd557ff85c26_b 5 +S 8a0a47d8dd7a78da_b 5 +S c73d6d644bed65e5_b 5 +S b0ab9ffaecaafb96_b 5 +S 97f8568134bd1067_b 5 +S 6fc5714fb1cf8e08_b 5 +S 04b8bb2c5c22a0b5_b 5 +S 164d4aed64d88778_b 5 +S c9df1b8172e628f0_b 5 +S 64180fce2ed99d2c_b 5 +S de1e1792e5492b87_b 5 +S 85f0812628bd2b46_b 5 +S b87478e3dd42aeec_b 5 +S c716d2790f9e164d_b 5 +S 83cbd6ccfe204855_b 5 +S 7779bebb49937129_b 5 +S f9d9c369cc93f66c_b 5 +S 1d00e553597c4924_b 5 +S 683e0a8a8d1844b8_b 5 +S ee32511072248657_b 5 +S aa793a94d0c2cfad_b 5 +S 2a9792c9e0b764de_b 5 +S f702871dc02052f6_b 5 +S 9d243d50e53a169b_b 5 +S 1635dfb67dd8669d_b 5 +S 6242011914377fc7_b 5 +S 6fd8f23d04f7509f_b 5 +S 738dc083e8a0d7d1_b 5 +R 323163353530306261366439393537665f62000000000000653231633037333763373839653661315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800002510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 323163353530306261366439393537665f62000000000000396138666366373063373662333034325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800002510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 323163353530306261366439393537665f62000000000000343935383732303363303366393038325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000005010108604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800002510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000646539633661306333643433643333365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000643066353261336630386234653065335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000616366323565313634633435306564665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000613539653432626262633663326333365f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000006e00000000000000000000000000000000000000000000000000000000000000000000000100000000000000ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000333565626363633532396363353861395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000636461343839613864353233616336385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 333661373433373264386261333334665f62000000000000353961616133383138643239356439615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613738663836656634636433323930385f62000000000000633462383938333032616435383534665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000373837623566333930323966633037395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376132663166383431383162363737315f62000000000000626639623836386330346434646265335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376132663166383431383162363737315f62000000000000653631616262633465613930623539325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 643535393739363564366466366561635f62000000000000316237663333633361643564656130375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 643535393739363564366466366561635f62000000000000383261303866623834623362636435615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 653139373764623337666233646632395f62000000000000393664326435653565323366626337375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 653139373764623337666233646632395f62000000000000306462383130376531306131323038305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 363136396236643531656333376162635f62000000000000363765353263363964623266306662655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000373265616665346265396237333063635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 356531333536636662393062353835365f62000000000000633438653537376530323732633930325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 666434356337643030316530303465395f62000000000000653638656232376238326434663730325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336635666164663863633062366630345f62000000000000663237313737376533663065333162365f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000007300000000000000000000000000000000000000000000000000000004010000040100000100000000000000ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000333565626363633532396363353861395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +C abef20ad0d9a9b12_b +R 323163353530306261366439393537665f62000000000000396138666366373063373662333034325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800002510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613234616134633633343938653733315f62000000000000616464633061316165366132373861655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800002510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613234616134633633343938653733315f62000000000000623434396562353835396362656136615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800002510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 323163353530306261366439393537665f62000000000000303833323465623862376261646661635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800002510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 333661373433373264386261333334665f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613738663836656634636433323930385f62000000000000333063623837373039663931646431305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000626330356433623331363331636562385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 333661373433373264386261333334665f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613738663836656634636433323930385f62000000000000333063623837373039663931646431305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000626330356433623331363331636562385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 346465636262313264643661653237355f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e0000000000000000000000000000000000000000000000000000000401000004010000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800002510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000643138303362653763333065316432375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000353961616133383138643239356439615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313038323332636663343337373561645f62000000000000336464396666633936666138376238315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000386639346138353335323335666633325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 346632656435386339363533646430335f62000000000000326238613230646166313934306231325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 306136653163613664353263653834655f62000000000000653264623032333263393236646234395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000383362623933363936623638316662355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000383033333864346538613666366661355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 316366326162643662323936663935625f62000000000000616431383430313761393665353562655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000336437356138366437373863323633655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000346434306435323262353038656332395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000383234306637656134343137323039645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000386364656638613061653932396638395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000343533336636343731616531336333365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000666565363466303935626332303862345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613738663836656634636433323930385f62000000000000326166376336393935326166643335665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000666439613635393232636363636163365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000383235333939633461383564633831635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000626365313465383961313563383738635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000376562346335376461313335666337625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000653137376231313464326230336564625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000633239666239386561363732316332615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000646432323732643736396534356337355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 363763366431636239663566633161395f62000000000000383231353065363033633138353437345f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313336623132646663343134613533345f62000000000000663566613632616336643263303066325f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000626231303730643039326231313863665f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326232643737353736386131643162335f62000000000000653839333930616336623034336538345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000260c00000000000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 653539363663613332303739646435335f62000000000000613666356134346436303232653662615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 333534353364366234626234373433615f62000000000000363936643561323035313835663861355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326637633638663130623235303138665f62000000000000366635316436353964623834343138615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623336393532313339636233346565635f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082700001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623336393532313339636233346565635f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082700001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623336393532313339636233346565635f62000000000000353961616133383138643239356439615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082700001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313537643338303233313531303235325f62000000000000373637636336376239386336346130655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 363539633165303264333637666137365f62000000000000653730663732333665306230363238305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000623031623661656435303330653438655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000666336383365613134313031326331325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 363539633165303264333637666137365f62000000000000636332646534393562393064646637305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313537643338303233313531303235325f62000000000000303339366233363332616337656136315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000306233306134623164363735386236625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313038323332636663343337373561645f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000333963333666353034393862383966665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000363962663365626166653235393665645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000333834383735626630363665623539335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000666333656633373234316366376336635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 633766376137386434663566383935385f62000000000000666664386131616330613835636231665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376238656133386466373036613763615f62000000000000613136646231616535376335666563355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000260c00002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303030333034636136333866323834665f62000000000000323366356566623033366339363861335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303030333034636136333866323834665f62000000000000663839623037323436353461616466385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303030333034636136333866323834665f62000000000000383930383931376266333663323636375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000386639346138353335323335666633325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 656461613035326464366135373236625f62000000000000303765663732653161356163656634655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 656461613035326464366135373236625f62000000000000616538386130663761333930633536355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 656461613035326464366135373236625f62000000000000376464353166386463363539323232325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000386639346138353335323335666633325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000666439613635393232636363636163365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000386639346138353335323335666633325f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 646139366639333838303330323333305f62000000000000393233326534623931653734353030625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000336239313231323266313563373162625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000326139303136653032623432663134645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 363261353538646439303665346331655f62000000000000346631356137636233383737376163665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000366566366361353463376431636433325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 323333323230333637626537396132615f62000000000000653830366363393636386336666437315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000626330356433623331363331636562385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000643138303362653763333065316432375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313537643338303233313531303235325f62000000000000393161343532393936336163323666325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000646662313763623662373365333636325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000336437356138366437373863323633655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313537643338303233313531303235325f62000000000000393530376638653638633535336430345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 362ca3325fc3310f_b 1 +R 613738663836656634636433323930385f62000000000000333632636133333235666333333130665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 336564313131316666663739613063615f62000000000000653537346562643635666530663462385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613738663836656634636433323930385f62000000000000613361626462306134336530656461355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 633538643263653532313562363337635f62000000000000623335336233633739383662353637325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613234616134633633343938653733315f62000000000000376636326337333635633434636134325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800002510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613234616134633633343938653733315f62000000000000623434396562353835396362656136615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001008028204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800002510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 653931666166393233303163303237305f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 653931666166393233303163303237305f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000313036396661643861646366646630625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000646164643333396364363665666563615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613738663836656634636433323930385f62000000000000613031393664303562623461633965375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 353965373333383566616461656436655f62000000000000303261363136393664643765326535395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 653931666166393233303163303237305f62000000000000306663396137633631343239333565635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000346666326261313061393466333236615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 313661366365323931323737316238625f62000000000000376164663837316664613762366362315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 333138653763363930343266366430385f62000000000000363234613163346364653866623734385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 343234656638623239313039373365365f62000000000000353961616133383138643239356439615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 643639353530613663366531346534375f62000000000000353063623334363863653838366634375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000326263366536386433306334376133375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 366638306539643632393733363938365f62000000000000353730393336666566303161636465635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 393365383036396463306335393363355f62000000000000613965336232646335363330333733325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 393365383036396463306335393363355f62000000000000643734396438343330653166363136635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000346566663965396533613863313834355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000383335313437323936346434613934375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 646537653366303836323035393166305f62000000000000643134353839373339333462383361305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 646139366639333838303330323333305f62000000000000353061313031343563363963306261645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000626633343339326266316666333863625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 633138643936643036343436373131365f62000000000000363533363163393762343234303465625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 386231356430363738333233626434655f62000000000000363065386264316235646537386266315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 646139366639333838303330323333305f62000000000000653333303238326238383535643230615f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 323163353530306261366439393537665f62000000000000396138666366373063373662333034325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000f000000000000001008028204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800002510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 626662643163633563616666306164325f62000000000000383535613363613535396564663830645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 626662643163633563616666306164325f62000000000000333035633333323435646632333430625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 623665313635626332346362353831645f62000000000000366433373330346466616330343830645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376132663166383431383162363737315f62000000000000616664323633346536313466616461625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376132663166383431383162363737315f62000000000000636132323438613634663565643430625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376132663166383431383162363737315f62000000000000346232313233366237353964373162625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 626563393164353930346635333562645f62000000000000616537616531326631663364646230315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000373663653034323933663335313766305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 626563393164353930346635333562645f62000000000000616633626435643534376639343864345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000333036316361666535373630363561395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000303662306565343835373661373638335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 626563393164353930346635333562645f62000000000000383333333433633561346338666639615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 633766376137386434663566383935385f62000000000000623733313061636537616666323031635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376132663166383431383162363737315f62000000000000346661366364663562663461656332645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 666131363565616361306236363364375f62000000000000343332646238313862396662366164335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000260c00002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 393365383036396463306335393363355f62000000000000343862366131643063363535623632625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 2d80c18620dddcb9_b 0 +S b7cf06134b53d217_b 1 +R 326438306331383632306464646362395f62000000000000623763663036313334623533643231375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303233326464333863623338383139385f62000000000000326361616530346665363765626439315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000080000000029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303233326464333863623338383139385f62000000000000396538633536663264336134356437615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000080000000029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303233326464333863623338383139385f62000000000000363732363934396162636330663030625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000080000000029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 646139366639333838303330323333305f62000000000000373063636634383730333166663539635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 646139366639333838303330323333305f62000000000000663238643936353730343438613236325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 306161643035646337653635656134615f62000000000000316537386165653765306636386436635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 646139366639333838303330323333305f62000000000000316438313331353866613166373665395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376132663166383431383162363737315f62000000000000323063333263386137626664633132315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613261666533373335353761363065365f62000000000000343833656536353332386261306633355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008028204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 8f746a918ca1d0cc_b 1 +R 326539343561653231363066656433375f62000000000000386637343661393138636131643063635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S f455b20e18ff6c0c_b 1 +R 646139366639333838303330323333305f62000000000000663435356232306531386666366330635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 613261363539633630373566343435325f62000000000000313363376362643637333937363431375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 653465326163356238616431666638635f62000000000000643439633063306530616162313235635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376463323863653566323065626361345f62000000000000653830313362313033653464323437645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 633766376137386434663566383935385f62000000000000303136663463333463383163393638315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 05d27a91c6d66e05_b 1 +R 623665313635626332346362353831645f62000000000000303564323761393163366436366530355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 169dfd5a59700b02_b 0 +S 9cad521f1382630d_b 1 +R 313639646664356135393730306230325f62000000000000396361643532316631333832363330645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 300dc1f1d4295d47_b 1 +R 326539343561653231363066656433375f62000000000000333030646331663164343239356434375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 393365383036396463306335393363355f62000000000000343862366131643063363535623632625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S b581cd06e356848b_b 0 +S 3eacd372740d8c8c_b 1 +R 623538316364303665333536383438625f62000000000000336561636433373237343064386338635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 5a1df754ef355102_b 1 +R 323333323230333637626537396132615f62000000000000356131646637353465663335353130325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 06f514418e7d20e8_b 1 +R 633766376137386434663566383935385f62000000000000303666353134343138653764323065385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 96e36d04bf83b338_b 1 +R 613261666533373335353761363065365f62000000000000393665333664303462663833623333385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S ce5dcc6547aad52c_b 0 +S 90f8f9d8ae85077d_b 1 +R 636535646363363534376161643532635f62000000000000393066386639643861653835303737645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 59b238fc6b3b638c_b 0 +S c39d0fa66be050c8_b 1 +R 353962323338666336623362363338635f62000000000000633339643066613636626530353063385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S cfce7669615a63e6_b 1 +R 646139366639333838303330323333305f62000000000000636663653736363936313561363365365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 701812978a7f8fd9_b 0 +S 028ce98fc8896ee3_b 1 +R 373031383132393738613766386664395f62000000000000303238636539386663383839366565335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000000000000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 55d23ab9ff32d45c_b 0 +S e52e3a92abf3a3e9_b 1 +R 353564323361623966663332643435635f62000000000000653532653361393261626633613365395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 1195ee20ece15758_b 0 +S 6ffc9ec2fbe9ea59_b 1 +R 313139356565323065636531353735385f62000000000000366666633965633266626539656135395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 1e13ed31e8740aba_b 1 +R 376132663166383431383162363737315f62000000000000316531336564333165383734306162615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S e53014ecd317f50b_b 1 +R 646139366639333838303330323333305f62000000000000653533303134656364333137663530625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 7db8650de502f1c5_b 1 +R 646139366639333838303330323333305f62000000000000376462383635306465353032663163355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S f5d9076394e7f0c1_b 1 +R 646139366639333838303330323333305f62000000000000663564393037363339346537663063315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008028204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 09af0e49a31c9b7c_b 1 +R 376132663166383431383162363737315f62000000000000303961663065343961333163396237635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 279dff62217d1db6_b 1 +R 326539343561653231363066656433375f62000000000000323739646666363232313764316462365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S e7c82ffc8027f7ab_b 1 +R 623665313635626332346362353831645f62000000000000653763383266666338303237663761625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018250000202700002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000004000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 2543f4d4293ce7d4_b 0 +S 75278d37e3290cba_b 1 +R 323534336634643432393363653764345f62000000000000373532373864333765333239306362615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000250000082b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000004000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 56302b49799b0dcf_b 0 +R 353633303262343937393962306463665f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S e7555299bcd6a2f3_b 0 +S d23da0bf16a2bbfa_b 1 +S c5f026aa6eb8c5a2_b 1 +R 653735353532393962636436613266335f62000000000000643233646130626631366132626266615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 353633303262343937393962306463665f62000000000000633566303236616136656238633561325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S e8e918a20c0b67d8_b 1 +R 633766376137386434663566383935385f62000000000000653865393138613230633062363764385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S f05bad914fb70cdc_b 1 +R 376132663166383431383162363737315f62000000000000663035626164393134666237306364635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 7b5eec1639d01171_b 1 +R 633766376137386434663566383935385f62000000000000376235656563313633396430313137315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 408f3e85364759c1_b 1 +R 376132663166383431383162363737315f62000000000000343038663365383533363437353963315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 4866b832c7f57ed7_b 1 +R 323333323230333637626537396132615f62000000000000343836366238333263376635376564375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e00000000000000000000000000000000000000000000000000000004010000040100000100000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S e3bb44b52912ad62_b 1 +S 78fec2bee40b9a17_b 1 +S ad1eeb1267eb7f21_b 1 +R 323333323230333637626537396132615f62000000000000653362623434623532393132616436325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376132663166383431383162363737315f62000000000000373866656332626565343062396131375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 633766376137386434663566383935385f62000000000000616431656562313236376562376632315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 07b0ddd064296e6b_b 1 +R 326539343561653231363066656433375f62000000000000303762306464643036343239366536625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f00000000000000101804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S 1f920ab4cf9a8d85_b 1 +S 1ab09b00f6ba0b67_b 1 +R 376238656133386466373036613763615f62000000000000316639323061623463663961386438355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000260c00002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376132663166383431383162363737315f62000000000000316162303962303066366261306236375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 376132663166383431383162363737315f62000000000000343038663365383533363437353963315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001018048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000292000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +S a5d9c9a884e12d15_b 1 +R 646139366639333838303330323333305f62000000000000613564396339613838346531326431355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000040100000401000001000000010000000f000000000000001008028204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000002910000016180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 326539343561653231363066656433375f62000000000000303762306464643036343239366536625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000003e000000000000000000000000000000000000000000000000000000040100000401000001000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000002b00001029000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000800000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 diff --git a/dm/games/settings.tsv b/dm/games/settings.tsv index 821909c41b..e494765567 100644 --- a/dm/games/settings.tsv +++ b/dm/games/settings.tsv @@ -17,6 +17,7 @@ DM_FPS_TARGET choice 30=30 fps,60=60 fps,120=120 fps?DM_GAME_FPS_MAX==120&platform:mac DM_GAME_FPS_TARGET DM_GAME_FPS_TARGET!=0 Game Frame rate level=basic DM_DYNAMIC_RESOLUTION toggle - 0 fixups:DYNAMIC_RESOLUTION Game Dynamic resolution Adjusts resolution between 70% and 100% under load. Turn off to keep full resolution for the selected console mode. DM_RENDER_SCALE range 0.5:1.0:0.05 1.0 fixups:RENDER_SCALE Game Render scale level=basic +DM_RESOLUTION_SCALE choice 0=Game's own,0.75=75%,1=100% 0 fixups:RESOLUTION_SCALE Game Resolution Share of the output picture the game renders its scene at. Higher looks sharper and uses more GPU time; on a 4K screen 100% is 4K. DM_OPMODE choice 1=Docked,0=Handheld DM_GAME_OPMODE always Game Console mode level=basic DM_PRESENT_UPSCALE choice off=Standard,metalfx=MetalFX off always Game Upscaling Uses more GPU time and can increase heat. DM_UPSCALER choice game=Game's own,metalfx=MetalFX game DM_GAME_UPSCALER_N!=0 Game Game's upscaler diff --git a/dm/gfx/hle_vi.c b/dm/gfx/hle_vi.c index 56e37ee4dd..e2ae42302a 100644 --- a/dm/gfx/hle_vi.c +++ b/dm/gfx/hle_vi.c @@ -73,11 +73,20 @@ HLE_FORCE("_ZN2nn2vi32GetDefaultDisplayPanelIdentifierEPNS0_15PanelIdentifierE", memset(out, 0, 0x18); return RES_OK; } // The Great Ace Attorney Chronicles (SDK 10) lists up to 10 displays before opening the default one (main+0x808f08) and does not read the list. DisplayInfo is 0x60 bytes: -// name[0x40], bool has a layer limit at +0x40, then u64 layer count limit, largest layer width and height. One display, "Default", as Horizon lists for an application -HLE_FORCE("_ZN2nn2vi12ListDisplaysEPNS0_11DisplayInfoEi", "list displays; the host has one, \"Default\"", int, h_vi_ListDisp, void *out, int n) { +// name[0x40], bool has a layer limit at +0x40, then u64 layer count limit, largest layer width and height. One display, "Default", as Horizon lists for an application. +// The largest layer is the largest picture the display shows now: 1920x1080 on a Switch 1 (its TV output and its panel's 1280x720 alike), and on a Switch 2 the largest display +// buffer (QueryDisplayBufferMaxResolution below: its 1080p screen handheld, docked up to 4K by the TV). Star Fox makes its output that size (the window manager stores it at +// main+0xba66a78; its output is the smaller of it and the largest buffer, main+0xb448874), so the Switch 1 answer held it at 1920x1080 on a 4K screen, where its data's scale +// (render.resolution_scale_console 0.5) gives a 1920x1080 scene for a 3840x2160 output +static uint32_t buf_max(int *dw, int *dh); +static const int k_buf_max[4][2] = {{1280, 720}, {1920, 1080}, {2560, 1440}, {3840, 2160}}; +HLE_FORCE("_ZN2nn2vi12ListDisplaysEPNS0_11DisplayInfoEi", "list displays; the host has one, \"Default\", with the largest picture it shows now as its largest layer", int, h_vi_ListDisp, void *out, int n) { if (n <= 0 || !out) return 0; uint8_t *p = out; memset(p, 0, 0x60); strcpy((char *)p, "Default"); - p[0x40] = 1; uint64_t lim[3] = {1, 1920, 1080}; memcpy(p + 0x48, lim, sizeof lim); + p[0x40] = 1; uint64_t lim[3] = {1, 1920, 1080}; + if (dm_sdk_ounce()) { int w, h; uint32_t r = buf_max(&w, &h); lim[1] = (uint64_t)k_buf_max[r][0]; lim[2] = (uint64_t)k_buf_max[r][1]; } + memcpy(p + 0x48, lim, sizeof lim); + static atomic_int once; if (!atomic_exchange(&once, 1)) LOG("vi::ListDisplays: Default, largest layer %llux%llu", (unsigned long long)lim[1], (unsigned long long)lim[2]); return 1; } HLE_FORCE("_ZN2nn2vi12DestroyLayerEPNS0_5LayerE", "destroy layer; host static object", void, h_vi_DestroyLayer, void *layer) { (void)layer; } @@ -104,14 +113,17 @@ HLE_FORCE("_ZN2nn2vi23SetDisplayVrrCapabilityEPNS0_7DisplayEb", "display VRR cap __attribute__((weak)) int front_display_pixels(int *w, int *h) { (void)w; (void)h; return 0; } // front_mac.m, front_ios.m; graphics unit tests have none HLE_FORCE("_ZN2nn2vi31QueryDisplayBufferMaxResolutionEPNS0_19BufferMaxResolutionEPKNS0_7DisplayE", "largest display buffer: the Switch 2's screen handheld, the host display's docked", Result, h_vi_BufMaxRes, uint32_t *out, const void *disp) { - (void)disp; static const int k[4][2] = {{1280, 720}, {1920, 1080}, {2560, 1440}, {3840, 2160}}; + (void)disp; int w, h; uint32_t r = buf_max(&w, &h); + static atomic_int once; if (!atomic_exchange(&once, 1)) LOG("vi::QueryDisplayBufferMaxResolution: %dx%d (%s, display %dx%d)", k_buf_max[r][0], k_buf_max[r][1], dm_opmode() == 1 ? "docked" : "handheld", w, h); + if (out) *out = r; return RES_OK; +} +static uint32_t buf_max(int *dw, int *dh) { // the index into k_buf_max, and the display's pixels (0 x 0 when not known) uint32_t r = 1; int w = 0, h = 0; if (dm_opmode() == 1 && front_display_pixels(&w, &h)) { if (w < h) { int t = w; w = h; h = t; } - r = 0; for (uint32_t i = 0; i < 4; i++) if (w >= k[i][0] && h >= k[i][1]) r = i; + r = 0; for (uint32_t i = 0; i < 4; i++) if (w >= k_buf_max[i][0] && h >= k_buf_max[i][1]) r = i; } - static atomic_int once; if (!atomic_exchange(&once, 1)) LOG("vi::QueryDisplayBufferMaxResolution: %dx%d (%s, display %dx%d)", k[r][0], k[r][1], dm_opmode() == 1 ? "docked" : "handheld", w, h); - if (out) *out = r; return RES_OK; + *dw = w; *dh = h; return r; } // The extended swap interval asks for a presentation rate between whole vsync intervals (VRR); without VRR the swap interval NVN sets stays in effect HLE_FORCE("_ZN2nn2vi28SetLayerExtendedSwapIntervalEPNS0_5LayerEii", "layer extended swap interval: needs VRR, which the host has not; NVN's swap interval stays", Result, h_vi_ExtSwap, diff --git a/dm/gfx/nvn/hle_nvn.c b/dm/gfx/nvn/hle_nvn.c index 060bdb8fb0..2ecd4f04b9 100644 --- a/dm/gfx/nvn/hle_nvn.c +++ b/dm/gfx/nvn/hle_nvn.c @@ -1398,12 +1398,16 @@ NVN(nvnWindowBuilderSetTextures, void, NVNwindowBuilder *b, int n, NVNtexture *c } NVN(nvnWindowBuilderSetPresentInterval, void, NVNwindowBuilder *b, int v) { WB(b)->interval = v; } NVN(nvnWindowBuilderGetPresentInterval, int, const NVNwindowBuilder *b) { return WB(b)->interval; } // Yoshi and the Mysterious Book (Unreal Engine 5.4) reads it back +// A native window no display shows: the host's answer for a layer the graphics system would send elsewhere (GameChat's virtual camera, hle_misc.c). Its NVN window takes the +// game's frames and drops them: they are not shown, do not pace the game and do not count as its frames. 0 in graphics unit tests +__attribute__((weak)) int dm_native_window_offscreen(const void *native) { (void)native; return 0; } NVN(nvnWindowInitialize, NVNboolean, NVNwindow *w, const NVNwindowBuilder *b) { const win_builder_t *s = (const win_builder_t *)b; win_t *o = (win_t *)w; memset(o, 0, sizeof *o); o->magic = MAGIC('W', 'I', 'N', 'D'); o->native = s->native; o->ntex = s->ntex; o->interval = s->interval; + o->offscreen = dm_native_window_offscreen(s->native); memcpy(o->tex, s->tex, sizeof o->tex); - for (int i = 0; i < o->ntex; i++) if (o->tex[i]) mtl_xv_window_tex(CTX(o->tex[i])->serial); - LOG("[nvn] WindowInitialize swap chain %d textures, interval %d, first %dx%d format %#x", o->ntex, o->interval, + if (!o->offscreen) for (int i = 0; i < o->ntex; i++) if (o->tex[i]) mtl_xv_window_tex(CTX(o->tex[i])->serial); + LOG("[nvn] WindowInitialize %sswap chain %d textures, interval %d, first %dx%d format %#x", o->offscreen ? "off-screen " : "", o->ntex, o->interval, o->ntex && o->tex[0] ? (int)CTX(o->tex[0])->d.width : 0, o->ntex && o->tex[0] ? (int)CTX(o->tex[0])->d.height : 0, o->ntex && o->tex[0] ? CTX(o->tex[0])->d.format : 0); return 1; } @@ -1449,6 +1453,10 @@ extern uint64_t g_t0_ns; // Host process start point (main.c; same base as the NVN(nvnWindowAcquireTexture, NVNwindowAcquireTextureResult, NVNwindow *w, NVNsync *s, int *idx) { win_t *o = (win_t *)w; *idx = o->ntex ? o->next++ % o->ntex : 0; + if (o->offscreen) { // nothing shows its frames, so nothing holds a texture: free once the commands before this point are done + if (s) { ((sync_t *)s)->fenced = 2; ((sync_t *)s)->fence = mtl_last_fence(); } + return NVN_WINDOW_ACQUIRE_TEXTURE_RESULT_SUCCESS; + } // Vsync blocks here (real-device NVN: when all textures in the swapchain are waiting for display, wait for the next one to be released), not in present -- the game often calls present while holding a lock uint64_t at = *idx < 4 ? o->avail[*idx] : 0, now = dm_detclock_enabled() ? guest_ns() : now_ns(), wait = at > now ? at - now : 0, pace_ns = 0; if (!dm_detclock_enabled()) { // Register the acquire thread as a time-constraint thread (no longer registered only when it "arrived early": it must also declare itself when it is constantly behind in the hot state) @@ -1648,8 +1656,8 @@ static void tsummary(uint64_t frame) { LOG("[nvn] thread policy: main thread real-time computation %.2f ms / period %.2f ms, real-time policy %s, current priority %d (base %d, policy %d); %u worker threads QoS %#x; present QoS %#x", g_rt_comp_ms, g_rt_period_ms, rt_live ? "in effect" : "not in effect", okx ? xi.pth_curpri : -1, okx ? xi.pth_priority : -1, okx ? xi.pth_policy : -1, wn, wq, mtl_present_qos()); } py = cy; pk = ck; pw = cw; } pi = ci; pc = cc; pd = dr_; pf = frame; } - uint64_t up, re, es = mtl_pkg_edge_skips(), fa, pr; mtl_pkg_stats(&up, &re); nvn_dirty_stats(&fa, &pr); - LOG("[nvn] packaged textures: first uploads %llu, re-uploads on pool content change %llu, writes beside a texture only (not re-uploaded) %llu; write-protection faults %llu, pages unprotected before host writes %llu; missed %llu (cumulative); CPU-written textures alive %u", up, re, es, fa, pr, mtl_pkg_miss(), mtl_cpu_tex_count()); + uint64_t up, re, es = mtl_pkg_edge_skips(), ca = mtl_pkg_copy_absorbs(), fa, pr; mtl_pkg_stats(&up, &re); nvn_dirty_stats(&fa, &pr); + LOG("[nvn] packaged textures: first uploads %llu, re-uploads on pool content change %llu, writes beside a texture only (not re-uploaded) %llu, GPU copies into one written into its storage too (not re-uploaded) %llu; write-protection faults %llu, pages unprotected before host writes %llu; missed %llu (cumulative); CPU-written textures alive %u", up, re, es, ca, fa, pr, mtl_pkg_miss(), mtl_cpu_tex_count()); memset(g_tn, 0, sizeof g_tn); } // DM_SLOWFRAME=1 (test switch, read over the log port on a real device): per-frame timings are first stored in a ring of the last 16 frames; dropped frames are judged 8 frames late (GPU / on-screen present times are back by then), @@ -1989,6 +1997,7 @@ static const int *present_crop(const int win[4], int tw, int th, int lc[4]) { } NVN(nvnQueuePresentTexture, void, NVNqueue *q, NVNwindow *w, int idx) { (void)q; win_t *o = (win_t *)w; o->presents++; + if (o->offscreen) return; // dropped (nvnWindowInitialize) dm_ue_cvar_tick(); if (fps_high()) high_cap_tick(); if (dm_fps_state) __atomic_store_n((uint32_t *)(dm_fps_state + 4), (uint32_t)dm_movie_playing(), __ATOMIC_RELAXED); // the stubs' copy of the movie state (hle.h) @@ -2645,6 +2654,13 @@ NVN_NOPROTO(nvnCommandBufferEvaluateDlss, void, NVNcommandBuffer *c, const dlss_ o->tex[k] = tex_snap(o, SNAP_OFF(p_dlss), k, p->tex[k], (uint64_t)__builtin_return_address(0)); memcpy(o->base[k], p->base[k], sizeof o->base[k]); } + { // the sizes, logged when they change (8 lines at most): the scene's size and what the network makes of it + static int last[4], lines; int a = p->tex[DLSS_OUTPUT] ? (int)CTX(p->tex[DLSS_OUTPUT])->d.width : 0, b = p->tex[DLSS_OUTPUT] ? (int)CTX(p->tex[DLSS_OUTPUT])->d.height : 0; + if ((p->iw != last[0] || p->ih != last[1] || a != last[2] || b != last[3]) && lines < 8) { + last[0] = p->iw; last[1] = p->ih; last[2] = a; last[3] = b; lines++; + LOG("[nvn] DLSS evaluation %dx%d into a %dx%d output (network %dx%d)", p->iw, p->ih, a, b, n->w, n->h); + } + } o->net = (uint64_t)(uintptr_t)n; o->iw = p->iw; o->ih = p->ih; o->ow = n->w; o->oh = n->h; o->flags = n->flags; memcpy(o->mv, p->mv, sizeof o->mv); memcpy(o->jitter, p->jitter, sizeof o->jitter); o->pre_exposure = p->pre_exposure; o->reset = p->reset != 0; } @@ -2961,10 +2977,16 @@ NVN(nvnTextureWriteTexelsStrided, void, const NVNtexture *t, const NVNtextureVie // RHIAsyncReallocateTexture2D: nvnCommandBufferCopyTextureToTexture, a level at a time) and writes the new, finer levels from the CPU; uploaded from the storage, the copied levels held // what the pool had there before (another texture's data, zeros), and the Yoshis' felt sampled speckles from the moment a level streamed in. −1 when the copy cannot be mirrored (3D, // a format mismatch, a region out of range): the GPU copy alone then stands until the next upload +int nvn_tex_level_range(const tex_t *t, unsigned level, unsigned layer, uint64_t *lo, uint64_t *hi) { // the storage of one level of one layer, as offsets into the texture's; −1 out of range + uint64_t a = nvn_tex_level_offset(&t->d, level), b = level + 1 < t->d.levels ? nvn_tex_level_offset(&t->d, level + 1) : t->L.layer_size; + if (b <= a || b > t->L.layer_size || (uint64_t)layer * t->L.layer_size + b > t->L.size) return -1; + *lo = (uint64_t)layer * t->L.layer_size + a; *hi = (uint64_t)layer * t->L.layer_size + b; + return 0; +} static int mirror_prepare(const tex_t *t, unsigned level, unsigned layer) { // unprotect (and mark written) the storage of one level of one layer - uint64_t lo = nvn_tex_level_offset(&t->d, level), hi = level + 1 < t->d.levels ? nvn_tex_level_offset(&t->d, level + 1) : t->L.layer_size; - if (hi <= lo || hi > t->L.layer_size || (uint64_t)layer * t->L.layer_size + hi > t->L.size) return -1; - dm_guest_write_prepare(t->mem + (uint64_t)layer * t->L.layer_size + lo, hi - lo); + uint64_t lo, hi; + if (nvn_tex_level_range(t, level, layer, &lo, &hi)) return -1; + dm_guest_write_prepare(t->mem + lo, hi - lo); return 0; } int nvn_tex_mirror_b2t(const tex_t *t, unsigned level, unsigned layer0, const NVNcopyRegion *r, const uint8_t *src, size_t row, size_t img) { diff --git a/dm/gfx/nvn/nvn_dirty.c b/dm/gfx/nvn/nvn_dirty.c index cb351958a7..81200917ec 100644 --- a/dm/gfx/nvn/nvn_dirty.c +++ b/dm/gfx/nvn/nvn_dirty.c @@ -232,6 +232,23 @@ int nvn_dirty_since_cached(const void **span, const void *addr, size_t len, uint } int nvn_dirty_since_span(const void *span, const void *addr, size_t len, uint64_t stamp) { return nvn_dirty_since_cached(&span, addr, len, stamp); } int nvn_dirty_since(const void *addr, size_t len, uint64_t stamp) { return nvn_dirty_since_span(NULL, addr, len, stamp); } +// A page counts unless it holds a byte of an excepted range: the host wrote those pages itself (a GPU copy's bytes written into the storage, nvn_mtl.m pkg_copy_absorb), and the caller +// judges any other write into them (none can be told from the host's own by the page's generation) +size_t nvn_dirty_since_except(const void *span, const void *addr, size_t len, uint64_t stamp, const uintptr_t (*ex)[2], int nex, uintptr_t *first) { + if (!len) return 0; + range_t *r = (range_t *)span; uintptr_t a = (uintptr_t)addr; + if (!r || !atomic_load_explicit(&r->live, memory_order_acquire) || a < r->base || a + len > r->end) r = find_span(a, len); + if (!r) return SIZE_MAX; + uintptr_t p = (a - r->base) >> g_shift, q = (a + len - 1 - r->base) >> g_shift; size_t n = 0; + for (uintptr_t i = p; i <= q; i++) { + if (atomic_load(&r->gen[i]) <= stamp) continue; + uintptr_t lo = r->base + (i << g_shift), hi = lo + g_pg; int mine = 0; + for (int k = 0; k < nex && !mine; k++) mine = ex[k][0] < hi && ex[k][1] > lo; + if (mine) continue; + if (!n++ && first) *first = lo < a ? a : lo; + } + return n; +} void nvn_dirty_slot_stats(int *live, int *used_slots, uint64_t *adds_total) { int n = atomic_load(&g_nr), active = 0; for (int i = 0; i < n; i++) active += live_at(i) != 0; diff --git a/dm/gfx/nvn/nvn_dirty.h b/dm/gfx/nvn/nvn_dirty.h index 1f3e50e064..c86d8b6452 100644 --- a/dm/gfx/nvn/nvn_dirty.h +++ b/dm/gfx/nvn/nvn_dirty.h @@ -15,6 +15,9 @@ int nvn_dirty_since(const void *addr, size_t len, uint64_t stamp); // Covered pa const void *nvn_dirty_span(const void *addr, size_t len); // The tracked range holding the span (a handle to keep; NULL = untracked) int nvn_dirty_since_cached(const void **span, const void *addr, size_t len, uint64_t stamp); // nvn_dirty_since keeping the last range found in *span int nvn_dirty_since_span(const void *span, const void *addr, size_t len, uint64_t stamp); // nvn_dirty_since through a kept handle (rechecked, scanned again only if it no longer holds the span) +// Pages of [addr, addr+len) written after the stamp that hold no byte of the ranges ex[0..nex) (a host write the caller accounts for): how many, the first one's address in *first +// (when not NULL); SIZE_MAX when the span is untracked +size_t nvn_dirty_since_except(const void *span, const void *addr, size_t len, uint64_t stamp, const uintptr_t (*ex)[2], int nex, uintptr_t *first); void nvn_dirty_stats(uint64_t *faults, uint64_t *preps); // Cumulative: number of page faults triggered by game writes, number of pages unprotected before host writes void nvn_dirty_mp_stats(uint64_t *calls, uint64_t *pages, uint64_t *ns); // Cumulative: this module's mprotect call count, pages covered, time spent void nvn_dirty_slot_stats(int *live, int *used_slots, uint64_t *adds_total); // Currently live slots, slot table high-water mark, total number of registrations diff --git a/dm/gfx/nvn/nvn_mtl.m b/dm/gfx/nvn/nvn_mtl.m index 5fc025c6e3..55af55f7b6 100644 --- a/dm/gfx/nvn/nvn_mtl.m +++ b/dm/gfx/nvn/nvn_mtl.m @@ -1860,6 +1860,11 @@ static void mtl_finish_gpu_at(int site) { {MTLPixelFormatBC3_RGBA, MTLPixelFormatBC3_RGBA_sRGB}, {MTLPixelFormatBC7_RGBAUnorm, MTLPixelFormatBC7_RGBAUnorm_sRGB}, }; +// The linear format of an sRGB one (the other half of its g_pfv_srgb pair), or MTLPixelFormatInvalid for a format that is not sRGB +static MTLPixelFormat pf_srgb_linear(MTLPixelFormat pf) { + for (size_t i = 0; i < sizeof g_pfv_srgb / sizeof *g_pfv_srgb; i++) if (pf == g_pfv_srgb[i].b) return g_pfv_srgb[i].a; + return MTLPixelFormatInvalid; +} static int tex_need_pfv(MTLPixelFormat base, MTLPixelFormat view) { if (base == view) return 0; for (size_t i = 0; i < sizeof g_pfv_srgb / sizeof *g_pfv_srgb; i++) @@ -2011,10 +2016,11 @@ static void tex_put(uint64_t k, id o) { // serials from 2^62 up are external t // Host record of a packaged texture: the current MTLTexture, the upload stamp, and the global write generation at the last check // spare: the texture the last re-upload replaced, kept resident and written by the next re-upload once the GPU has passed spare_fence (a texture the CPU rewrites every frame, a movie frame, // alternates between two textures instead of allocating one per frame: Link's Awakening's title movie made and freed an 8 MB texture a frame) -@interface NvPkg : NSObject { @public id tex, spare, view; uint64_t stamp, seen, hash, spare_fence, vgen, vseen, sub; const void *span; int sparse, vbase; uint8_t *edge[2]; uint32_t edge_n[2]; id ps; } @end // hash: full hash of the uploaded content under DM_NVN_DIRTYCHECK; span: its tracked range (nvn_dirty_span, NULL = untracked); +@interface NvPkg : NSObject { @public id tex, spare, view; uint64_t stamp, seen, hash, spare_fence, vgen, vseen, sub; const void *span; int sparse, vbase; uint8_t *edge[2]; uint32_t edge_n[2], copies; id ps; } @end // hash: full hash of the uploaded content under DM_NVN_DIRTYCHECK; span: its tracked range (nvn_dirty_span, NULL = untracked); // sparse: in a sparse virtual pool, read through its page table (hle_nvn.c nvn_sparse_*), vgen the page table's generation at the upload and vseen at the last look; view: what it is bound as (sparse_view) // ps: its placement sparse texture (NvSparse, sparse_make), which tex is: mapped and uploaded tile by tile (sparse_sync) // edge: the uploaded bytes of the storage's first and last host pages where other data shares them (pkg_edges_take) +// copies: GPU copies into it since its upload that were written into its storage and not absorbed (pkg_copy_absorb; the DM_NVN_REUPLOADS line) @implementation NvPkg - (void)dealloc { res_remove(tex); if (spare) res_remove(spare); free(edge[0]); free(edge[1]); } @end @@ -2055,6 +2061,50 @@ static int pkg_edges_clean(NvPkg *pk, const tex_t *t) { // the covered pages w pk->stamp = st; g_pkg_edge_skips++; return 1; } +// GPU copies into a texture the host uploads from its storage. The replay writes such a copy's bytes into the storage as well (nvn_tex_mirror_b2t / nvn_tex_mirror_t2t, from copy_b2t / +// copy_t2t), as the hardware's copy would, and the same copy, encoded on the GPU, writes them into the host texture: that write is the host's own, of bytes the host texture gets anyway, +// not a change to upload. Taken as one, each copy into such a texture uploaded all of it again at its next use, which was the next copy's own lookup: Star Fox streams its textures into +// block-compressed 2D arrays (512x512x128 with 10 levels, 43 MB; 1024x1024x64 with 6, 85 MB), a level of a layer per nvnCommandBufferCopyBufferToTexture, and a scene's 280 copies +// uploaded 12 GB in one frame (10 s). So once the copy is encoded, the storage is stamped and protected again (as pkg_edges_clean), and the texture keeps its host texture when no page +// wholly inside it was written since its upload but those of the copied levels (nvn_dirty_since_except) and its own bytes in its edge pages, outside the copied levels, are as kept +// there. A CPU write into the copied levels' pages between the copy's resolution of the texture (tex_mtl, which uploads what was written before) and this protection is not told +// from the copy's own: the storage holds it, the host texture gets it at the next write there. On the hardware the copy writes those bytes at the same time, a race in the game. +// DM_NVN_COPY_ABSORB=0 turns this off (to measure it) +static uint64_t g_pkg_copy_absorbs; +static int same_outside(const uint8_t *now, const uint8_t *kept, uintptr_t a, uintptr_t b, const uintptr_t (*ex)[2], int nex) { // [a, b) as kept, except bytes in the ex ranges + for (uintptr_t x = a; x < b;) { + uintptr_t skip = 0, y = b; // skip: the end of the ranges x lies in; y: the next range's start + for (int k = 0; k < nex; k++) { if (ex[k][0] <= x && x < ex[k][1]) { if (ex[k][1] > skip) skip = ex[k][1]; } else if (ex[k][0] > x && ex[k][0] < y) y = ex[k][0]; } + if (skip) { x = skip; continue; } + if (memcmp(now + (x - a), kept + (x - a), y - x)) return 0; + x = y; + } + return 1; +} +static int pkg_copy_absorb(const tex_t *t, id host, unsigned level, unsigned layer0, int nz) { // after the copy into levels level of layers layer0.. (nz) was written into the storage and encoded + static int on = -1; if (on < 0) { const char *e = getenv("DM_NVN_COPY_ABSORB"); on = !e || atoi(e) != 0; } + __unsafe_unretained id o = tex_get(t->serial); + if (![o isKindOfClass:[NvPkg class]]) return 0; + NvPkg *pk = o; pk->copies++; + if (!on || pk->sparse || pk->ps || !pk->span || !t->mem || !host || (host != pk->tex && host != pk->view) || nz <= 0) return 0; + uintptr_t stack[16][2], (*ex)[2] = nz <= 16 ? stack : malloc((size_t)nz * sizeof *ex); + if (!ex) return 0; + int ok = 1; + for (int z = 0; z < nz && ok; z++) { uint64_t lo, hi; ok = !nvn_tex_level_range(t, level, layer0 + (unsigned)z, &lo, &hi); ex[z][0] = (uintptr_t)t->mem + lo; ex[z][1] = (uintptr_t)t->mem + hi; } + uint64_t st = nvn_dirty_now(); + if (ok) nvn_dirty_protect(t->mem, t->L.size); // stamp, protect, then look (as pkg_upload): a write from here on is found at the next use + uintptr_t r[2][2], ia, ie; pkg_edge_ranges(t, r, &ia, &ie); + if (ok && ie > ia && nvn_dirty_since_except(pk->span, (const void *)ia, ie - ia, pk->stamp, (const uintptr_t (*)[2])ex, nz, NULL)) ok = 0; + for (int i = 0; i < 2 && ok; i++) // an edge page another write may share: the texture's own bytes there, outside the copied levels, as kept + if (r[i][1] > r[i][0] && nvn_dirty_since_span(pk->span, (const void *)r[i][0], r[i][1] - r[i][0], pk->stamp)) + ok = pk->edge_n[i] == r[i][1] - r[i][0] && same_outside((const uint8_t *)r[i][0], pk->edge[i], r[i][0], r[i][1], (const uintptr_t (*)[2])ex, nz); + if (ex != stack) free(ex); + if (!ok) return 0; + pk->stamp = pk->seen = st; pk->copies--; g_pkg_copy_absorbs++; + if (dirtycheck()) pk->hash = full_hash(t->mem, t->L.size); + pkg_edges_take(pk, t); // the edge bytes as they are now, the copy's included + return 1; +} // What a render pass drew, read back into the storage (rt_mirror_flush), is already the content of the host texture it was read from: that write is not a change to upload. The handler // takes a stamp, protects the storage again once it has written it and keeps the texture's bytes in its edge pages (pkg_absorb_note); at the next resolution the texture keeps its host // texture when that is still the one read back, no page wholly inside it was written since and its edge bytes are unchanged (pkg_absorb_take), as pkg_edges_clean judges neighbours' @@ -3201,6 +3251,21 @@ static void cpu_unc_drop(void) { } static id tex_mtl_(const tex_t *ct); static id tex_mtl(const tex_t *ct) { AP_B; id r = tex_mtl_(ct); AP_E(4); return r; } +// Diagnostic DM_NVN_REUPLOADS=1: a line for each re-upload of a texture taken from its storage (the first 400): its shape and size, the pages written since its upload and where the +// first of them lies, and the GPU copies into it since then whose bytes were written into its storage and not absorbed (pkg_copy_absorb) +static void reup_note(const NvPkg *pk, const tex_t *t) { + static int on = -1, nl; if (on < 0) on = getenv("DM_NVN_REUPLOADS") != NULL; + if (!on || nl >= 400) return; + nl++; + uintptr_t first = 0; size_t pg = (size_t)getpagesize(), n = pk->sparse ? 0 : nvn_dirty_since_except(pk->span, t->mem, t->L.size, pk->stamp, NULL, 0, &first); + unsigned layer = 0, lv = 0; + if (n && n != SIZE_MAX && t->L.layer_size) { uint64_t o = first - (uintptr_t)t->mem; layer = (unsigned)(o / t->L.layer_size); o %= t->L.layer_size; + while (lv + 1 < t->d.levels && nvn_tex_level_offset(&t->d, lv + 1) <= o) lv++; } + char w[96]; if (pk->sparse) snprintf(w, sizeof w, "a sparse pool's"); else if (n == SIZE_MAX) snprintf(w, sizeof w, "untracked"); + else snprintf(w, sizeof w, "%zu of %zu, the first in layer %u level %u", n, (size_t)((t->L.size + pg - 1) / pg), layer, lv); + MLOG("re-upload ser=%llu %ux%ux%u format %#x target %d levels %u: %.1f MB, frame %llu; pages written since its upload: %s; GPU copies into it since then written into its storage too: %u", + (unsigned long long)t->serial, t->d.width, t->d.height, t->d.depth, t->d.format, t->d.target, t->d.levels, t->L.size / 1048576.0, (unsigned long long)atomic_load(&g_cur_frame), w, pk->copies); +} // A sparse texture is bound from its first level whose pages, and those of every smaller level, are all mapped: a view of levels [r, n) samples as with a minimum LOD of r. // The translator drops TEX's LOD clamp and residency predicate, so Monster Hunter Rise's streamed textures were sampled at levels it had not mapped yet; those read 0, which ASTC // decodes as its error colour (magenta clothes on the title screen). Single-layer 2D textures only; the view follows each upload, as the mappings change only with one @@ -3345,8 +3410,9 @@ static void sparse_view(NvPkg *pk, const tex_t *t) { // when the GPU is done with it (see NvPkg), else a new one; the old one becomes the spare (pkg_upload_ made nt resident) id reuse = nil; if (pk->spare) { pthread_mutex_lock(&g_mu); uint64_t done = g_done; pthread_mutex_unlock(&g_mu); if (pk->spare_fence <= done && pk->spare.usage == pk->tex.usage) reuse = pk->spare; } + reup_note(pk, t); uint64_t st, vg = nvn_sparse_gen(); id nt = pkg_upload(t, &st, reuse, pk->tex.usage); - if (nt) { id old = pk->tex; pk->tex = nt; + if (nt) { id old = pk->tex; pk->tex = nt; pk->copies = 0; if (pk->spare && pk->spare != nt) defer_obj_release(pk->spare); // still in use, or of another shape: retired as before if (pk->sparse) sparse_view(pk, t); zb_report(t, pk->sparse ? (unsigned)pk->vbase : 0, "re-upload"); @@ -3485,6 +3551,7 @@ void mtl_mem_stat(unsigned long long frame, unsigned long long rss_mb) { } void mtl_pkg_stats(uint64_t *uploads, uint64_t *reuploads) { *uploads = g_pkg_uploads; *reuploads = g_pkg_reuploads; } uint64_t mtl_pkg_edge_skips(void) { return g_pkg_edge_skips; } +uint64_t mtl_pkg_copy_absorbs(void) { return g_pkg_copy_absorbs; } uint64_t mtl_pkg_miss(void) { return g_pkg_miss; } void mtl_vc_drop(uint64_t ser); static void treg_retire_serial(uint64_t ser); @@ -5434,10 +5501,15 @@ static void img_fit_upgrade(void) { os_unfair_lock_unlock(&g_rmu); } // The same view, in the texture's own class, for a swizzled view (the channel mapping of tex_by_id): Metal gives a swizzled view only the read usage (a base of usage 0x7, a view of 0x1), -// so an RGBX8 or RGB565 image was bound as the dummy and its writes were lost. An image takes no channel mapping, as a Vulkan storage image view must have the identity swizzle +// so an RGBX8 or RGB565 image was bound as the dummy and its writes were lost. An image takes no channel mapping, as a Vulkan storage image view must have the identity swizzle. +// An sRGB texture's image is its linear twin (pf_srgb_linear; no format-view usage needed for that pair): NVN's image loads and stores convert no sRGB, as OpenGL's image units, whose +// formats have no sRGB ones, while Metal decodes a read and encodes a write through an sRGB format. Star Fox's upscaler network (ddc729bcdb4c8df9) samples its RGBA8_SRGB input, which +// the game encodes once more beforehand, and stores its output, sRGB-encoded already, into an RGBA8_SRGB image (1536x864): Metal encoded it a second time, and the picture came out +// pale and washed out, its dark parts lifted (median 0.16 → 0.46) and with them the bloom's haze and the fur's grain static id img_fit(int tid, id t, int dpf, uint64_t *rid) { size_t n = mtl_pf_bytes(t.pixelFormat); int u = dpf == NVN_DPF_UINT, cls = dpf != NVN_DPF_FLOAT && mtl_pf_dpf(t.pixelFormat) != dpf; - MTLPixelFormat pf = !cls ? t.pixelFormat : n == 1 ? (u ? MTLPixelFormatR8Uint : MTLPixelFormatR8Sint) : n == 2 ? (u ? MTLPixelFormatR16Uint : MTLPixelFormatR16Sint) : n == 4 ? (u ? MTLPixelFormatR32Uint : MTLPixelFormatR32Sint) + MTLPixelFormat lin = pf_srgb_linear(t.pixelFormat); + MTLPixelFormat pf = !cls ? (lin != MTLPixelFormatInvalid ? lin : t.pixelFormat) : n == 1 ? (u ? MTLPixelFormatR8Uint : MTLPixelFormatR8Sint) : n == 2 ? (u ? MTLPixelFormatR16Uint : MTLPixelFormatR16Sint) : n == 4 ? (u ? MTLPixelFormatR32Uint : MTLPixelFormatR32Sint) : n == 8 ? (u ? MTLPixelFormatRG32Uint : MTLPixelFormatRG32Sint) : n == 16 ? (u ? MTLPixelFormatRGBA32Uint : MTLPixelFormatRGBA32Sint) : MTLPixelFormatInvalid; id base = t.parentTexture ? t.parentTexture : t; if (pf == MTLPixelFormatInvalid || tid <= 0 || tid >= g_ntreg) { @@ -5454,6 +5526,7 @@ static void img_fit_upgrade(void) { id v = [base newTextureViewWithPixelFormat:pf textureType:t.textureType levels:NSMakeRange(l0, t.mipmapLevelCount) slices:NSMakeRange(s0, ns)]; if (!v) { RED_ONCE(107, "cannot create the image view of class %s (texture ID %d, Metal format %lu)", u ? "uint" : "int", tid, (unsigned long)t.pixelFormat); return nil; } { static int once; if (cls && !once++) MLOG("image read in another class than its texture: first case texture ID %d Metal format %lu → %lu", tid, (unsigned long)t.pixelFormat, (unsigned long)pf); } + { static int once; if (!cls && pf != t.pixelFormat && !once++) MLOG("sRGB texture bound as an image: loaded and stored raw through a view of its linear format, first case texture ID %d Metal format %lu → %lu", tid, (unsigned long)t.pixelFormat, (unsigned long)pf); } r->im = (void *)CFBridgingRetain(v); r->im_of = (__bridge void *)t; r->im_rid = v.gpuResourceID._impl; *rid = r->im_rid; return v; } @@ -7911,7 +7984,7 @@ static uint64_t pool_gpu(int samp, int dtt, int dpf, int base, __unsafe_unretain (unsigned long)t.usage, (unsigned long)t.parentTexture.usage, (unsigned)b->reg, (unsigned)b->rw); t = nil; } - if (t && (swz_only || (b->dpf != NVN_DPF_FLOAT && mtl_pf_dpf(t.pixelFormat) != b->dpf))) { + if (t && (swz_only || (b->dpf != NVN_DPF_FLOAT && mtl_pf_dpf(t.pixelFormat) != b->dpf) || (pf_srgb_linear(t.pixelFormat) != MTLPixelFormatInvalid && t.textureType != MTLTextureTypeTextureBuffer))) { // img_fit: a view of the shader's class, or of an sRGB format's linear twin uint64_t r2 = 0; id v = img_fit(tid, t, b->dpf, &r2); if (v) { t = v; *rid = r2; } else if (swz_only) t = nil; } @@ -11739,9 +11812,9 @@ static void copy_b2t(const p_copy_b2t *c) { if (!mtl_addr(c->src, img * nz, &mb, &mo)) { RED_ONCE(23, "buffer→texture copy source is in no memory pool"); return; } // The copy's bytes belong in the texture's storage: written there now from the buffer's, unless the GPU writes the buffer (a copy, fill or update queued in this submission: pend_hits; a shader // or a texture→buffer copy of it: sbw_hits; one of a submission still running: gw_live) or a readback into the texture is pending (read back after the copy then) - int rb = !is3d && tex_storage_dst(c->tex); + int rb = !is3d && tex_storage_dst(c->tex), mir = 0; if (rb && img * nz && !mrb_pending(c->tex->serial) && !pend_hits(c->src, img * nz) && !g_sbw_over && !sbw_hits(c->src, c->src + img * nz) && !gw_live(c->src, c->src + img * nz) - && nvn_host_readable(c->src, img * nz) && !nvn_tex_mirror_b2t(c->tex, level, layer0, &c->r, (const uint8_t *)(uintptr_t)c->src, row, img)) { mirror_note(0, c->tex, level, "buffer", 0); rb = 0; } + && nvn_host_readable(c->src, img * nz) && !nvn_tex_mirror_b2t(c->tex, level, layer0, &c->r, (const uint8_t *)(uintptr_t)c->src, row, img)) { mirror_note(0, c->tex, level, "buffer", 0); rb = 0; mir = 1; } g_cut_copy = 1; if (is3d && passdump()) { const char *dd = getenv("DM_NVN_CBDUMP"); if (dd) { // the source bytes of a 3D upload, beside the uniform dumps (F_c3d_.bin) char p[1024]; snprintf(p, sizeof p, "%s/F%llu_c3d_%llu.bin", dd, (unsigned long long)atomic_load(&g_cur_frame), (unsigned long long)c->tex->serial); @@ -11751,7 +11824,7 @@ static void copy_b2t(const p_copy_b2t *c) { if (shift) { size_t wb = (size_t)((c->r.width + bw - 1) / bw) * bpb; id ab; size_t ao = arena_alloc(wb * rows * nz, &ab); if (rb_swap_gpu(sb.gpuAddress + mo, row, img, ab.gpuAddress + ao, wb, wb * rows, wb, rows, nz, shift)) { sb = ab; mo = ao; row = wb; img = wb * rows; } - else RED_ONCE(7, "RGB565-family buffer→texture copy left in the guest's order: red and blue exchanged"); + else { RED_ONCE(7, "RGB565-family buffer→texture copy left in the guest's order: red and blue exchanged"); mir = 0; } // the host texture does not get the storage's bytes: uploaded again } id b = blit(); if (is3d) @@ -11760,6 +11833,7 @@ static void copy_b2t(const p_copy_b2t *c) { for (int z = 0; z < nz; z++) enc_b_copy_buffer_texture(b, sb, mo + z * img, row, img, MTLSizeMake(c->r.width, c->r.height, 1), t, layer0 + c->r.zoffset + z, level, MTLOriginMake(c->r.xoffset, c->r.yoffset, 0)); if (rb) mirror_readback(c->tex, t, level, layer0, &c->r, "buffer", 0); + if (mir) pkg_copy_absorb(c->tex, t, level, layer0 + (unsigned)c->r.zoffset, nz); // the storage and the host texture both have the copy: no upload for it } // Texture copies a blit cannot do -- a format change, a scaled region or a mirrored one (MIRROR_X / MIRROR_Y) (Link's Awakening converts its 1408x792 RG11B10F scene to RGBA16F every frame; Super Mario 3D World scales 1920x1080 to 1280x720 @@ -11955,9 +12029,9 @@ static void copy_t2t(const p_copy_t2t *c) { int s3 = c->src->d.target == 2, d3 = c->dst->d.target == 2, nz = c->sr.depth ? c->sr.depth : 1; // The copy's bytes belong in the destination's storage: written there now from the source's storage when that holds its content and the copy is a plain one (the same Metal format: a // format change is drawn below and converts the bytes), else read back after the copy (decided before the draw path gives the destination render-target use, which makes it GPU-owned from then on) - int rb = !d3 && tex_storage_dst(c->dst); + int rb = !d3 && tex_storage_dst(c->dst), mir = 0; if (rb && !s3 && c->sr.width == c->dr.width && c->sr.height == c->dr.height && !(c->flags & (NVN_COPY_FLAGS_MIRROR_X_BIT | NVN_COPY_FLAGS_MIRROR_Y_BIT)) && s.pixelFormat == d.pixelFormat - && !mrb_pending(c->dst->serial) && tex_storage_src(c->src) && !nvn_tex_mirror_t2t(c->src, sl, sz0, &c->sr, c->dst, dl, dz0, &c->dr)) { mirror_note(0, c->dst, dl, "texture", 0); rb = 0; } + && !mrb_pending(c->dst->serial) && tex_storage_src(c->src) && !nvn_tex_mirror_t2t(c->src, sl, sz0, &c->sr, c->dst, dl, dz0, &c->dr)) { mirror_note(0, c->dst, dl, "texture", 0); rb = 0; mir = 1; } // The draw path renders into the destination: one made without render-target use (packaged) gets it first, as a whole-level clear does (Paper Mario: The Thousand-Year Door copies a // 128x128 RGBA8 render target into an RG8 texture, mirrored in Y) if ((c->sr.width != c->dr.width || c->sr.height != c->dr.height || s.pixelFormat != d.pixelFormat || (c->flags & (NVN_COPY_FLAGS_MIRROR_X_BIT | NVN_COPY_FLAGS_MIRROR_Y_BIT))) && !s3 && !d3 @@ -12003,6 +12077,7 @@ static void copy_t2t(const p_copy_t2t *c) { for (int z = 0; z < nz; z++) enc_b_copy_texture(b, s, sz0 + c->sr.zoffset + z, sl, MTLOriginMake(c->sr.xoffset, c->sr.yoffset, 0), MTLSizeMake(c->sr.width, c->sr.height, 1), d, dz0 + c->dr.zoffset + z, dl, MTLOriginMake(c->dr.xoffset, c->dr.yoffset, 0)); if (rb) mirror_readback(c->dst, d, dl, dz0, &c->dr, "texture", 0); + if (mir) pkg_copy_absorb(c->dst, d, dl, dz0 + (unsigned)c->dr.zoffset, nz); // the storage and the host texture both have the copy: no upload for it // Diagnostic DM_NVN_T2T_TRACE=WxH:file: after each copy into an RGBA16F texture of that size, copy the result once more into a trace buffer on the GPU timeline (frame numbers kept on the CPU side); after 240 copies write the file { static int on = -1; static uint32_t tw, th; static const char *tf; static id tb; static int tn; static uint64_t tfr[240], from; if (on < 0) { const char *e = getenv("DM_NVN_T2T_TRACE"), *fe = getenv("DM_NVN_T2T_FROM"); on = e && sscanf(e, "%ux%u", &tw, &th) == 2 && (tf = strchr(e, ':')) && *++tf; from = fe ? strtoull(fe, NULL, 10) : 0; } diff --git a/dm/gfx/nvn/nvn_obj.h b/dm/gfx/nvn/nvn_obj.h index 3716822e15..2a4112710b 100644 --- a/dm/gfx/nvn/nvn_obj.h +++ b/dm/gfx/nvn/nvn_obj.h @@ -63,7 +63,7 @@ typedef struct { uint32_t magic; volatile uint32_t *val; } ev_t; typedef struct { NVNdevice *dev; void *native; int32_t ntex, interval; NVNtexture *tex[4]; } win_builder_t; FITS(win_builder_t, NVNwindowBuilder); // avail[i]: time at which swapchain image i can be acquired again (ns, monotonic clock) = its display time + one present period; pace: target time of this window's present pacer -typedef struct { uint32_t magic; void *native; int32_t ntex, interval, next, crop[4]; NVNtexture *tex[4]; uint64_t presents, avail[4], pace, ticket[4]; } win_t; // ticket[i]: ticket of the most recent present of image i +typedef struct { uint32_t magic; void *native; int32_t ntex, interval, next, crop[4], offscreen; NVNtexture *tex[4]; uint64_t presents, avail[4], pace, ticket[4]; } win_t; // ticket[i]: ticket of the most recent present of image i FITS(win_t, NVNwindow); // Command buffer: commands are written into the command memory given by the game (AddCommandMemory), handle = segment start address; when it runs out, the game is called back for more memory @@ -245,6 +245,7 @@ void mtl_tex_release(tex_t *t); void mtl_pkg_stats(uint64_t *uploads, uint64_t *reuploads); unsigned mtl_cpu_tex_count(void); // live textures the CPU writes (retired snapshots are excluded) uint64_t mtl_pkg_edge_skips(void); // packaged texture checks that found only writes beside the texture (pkg_edges_clean) +uint64_t mtl_pkg_copy_absorbs(void); // GPU copies into a packaged texture whose bytes, written into its storage too, were not taken as a change to upload (pkg_copy_absorb) uint64_t mtl_pkg_miss(void); uint64_t mtl_upload_ns_take(void); // Take and zero: time spent uploading packaged textures on the submit thread since last time // DM_NVN_DIRTYCHECK diagnostic: number of missed detections // Packaged textures: number of first uploads, number of re-uploads due to pool content changes uint64_t mtl_upload_gpu_ns_take(void); // Take and zero: GPU execution time of upload command buffers (sum of GPUEndTime − GPUStartTime) @@ -262,6 +263,7 @@ int mtl_tex_gpu_owned(uint64_t serial); // its int nvn_ft_tracked(uint64_t serial); int nvn_tex_mirror_b2t(const tex_t *t, unsigned level, unsigned layer0, const NVNcopyRegion *r, const uint8_t *src, size_t row, size_t img); int nvn_tex_mirror_t2t(const tex_t *s, unsigned sl, unsigned ss, const NVNcopyRegion *sr, const tex_t *d, unsigned dl, unsigned ds, const NVNcopyRegion *dr); +int nvn_tex_level_range(const tex_t *t, unsigned level, unsigned layer, uint64_t *lo, uint64_t *hi); // one level of one layer in the texture's storage, as offsets; −1 out of range // A program's per-stage shader key (hle_nvn.c): the first 8 bytes of sha256(first 0x880 bytes of the control section (its own length when shorter) + code area). Computed at SetShaders (NVN lets the caller free the control section once it returns, and Unity does); // a stage whose code area was not yet in any memory pool then is computed the first time it is asked for. Returns 0 = no such stage int prog_key(const prog_t *p, unsigned stage, uint8_t key[8]); diff --git a/dm/gfx/tests/Makefile b/dm/gfx/tests/Makefile index 8ac4d8634f..135133e581 100644 --- a/dm/gfx/tests/Makefile +++ b/dm/gfx/tests/Makefile @@ -437,6 +437,9 @@ check_t_dlss_mfx: t_dlss_mfx t_image_usage: t_image_usage.m $(MTL_T_DEP) clang $(CFLAGS) -fobjc-arc -o $@ t_image_usage.m $(MTL_T_SRC) $(FW) check_t_image_usage: RUN_ENV = MTL_DEBUG_LAYER=1 +t_image_srgb: t_image_srgb.m $(MTL_T_DEP) + clang $(CFLAGS) -fobjc-arc -o $@ t_image_srgb.m $(MTL_T_SRC) $(FW) +check_t_image_srgb: RUN_ENV = MTL_DEBUG_LAYER=1 t_stencil_view: t_stencil_view.m $(MTL_T_DEP) clang $(CFLAGS) -fobjc-arc -o $@ t_stencil_view.m $(MTL_T_SRC) $(FW) check_t_stencil_view: RUN_ENV = MTL_DEBUG_LAYER=1 diff --git a/dm/gfx/tests/t_dirty_slots.c b/dm/gfx/tests/t_dirty_slots.c index ae1d3d4d81..f7e63116ef 100644 --- a/dm/gfx/tests/t_dirty_slots.c +++ b/dm/gfx/tests/t_dirty_slots.c @@ -4,6 +4,7 @@ #include #include #include +#include #include module_t *g_mod; @@ -99,5 +100,28 @@ int main(void) { EXPECT("B no longer tracked after destroying B", 0, nvn_dirty_tracked(pb, tex)); nvn_dirty_remove_range(pa); munmap(blk, 4 * pg); + + // Written pages but those holding a byte of the host's own write (nvn_dirty_since_except: a GPU copy's bytes the host wrote into a texture's storage, nvn_mtl.m pkg_copy_absorb) + uint8_t *st8 = mmap(NULL, 8 * pg, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); + if (st8 == MAP_FAILED) { perror("mmap"); exit(2); } + nvn_dirty_add_range(st8, 8 * pg); + const void *span = nvn_dirty_span(st8, 8 * pg); + nvn_dirty_protect(st8, 8 * pg); + stamp = nvn_dirty_now(); + uintptr_t ex[2][2] = {{(uintptr_t)st8 + pg + 0x100, (uintptr_t)st8 + 3 * pg - 0x100}, {(uintptr_t)st8 + 6 * pg + 0x800, (uintptr_t)st8 + 6 * pg + 0x900}}, first = 0; + EXPECT("nothing written: no page but the host's", 0, (long long)nvn_dirty_since_except(span, st8, 8 * pg, stamp, (const uintptr_t (*)[2])ex, 2, &first)); + dm_guest_write_prepare(st8 + pg + 0x100, 2 * pg - 0x200); memset(st8 + pg + 0x100, 6, 2 * pg - 0x200); + dm_guest_write_prepare(st8 + 6 * pg + 0x800, 0x100); memset(st8 + 6 * pg + 0x800, 7, 0x100); + EXPECT("only the host's own writes: none counted", 0, (long long)nvn_dirty_since_except(span, st8, 8 * pg, stamp, (const uintptr_t (*)[2])ex, 2, &first)); + EXPECT("the same writes without the exception: 3 pages", 3, (long long)nvn_dirty_since_except(span, st8, 8 * pg, stamp, NULL, 0, &first)); + EXPECT("... the first of them is page 1", 1, (long long)((first - (uintptr_t)st8) / pg)); + st8[4 * pg + 8] = 8; // a game write beside them + first = 0; + EXPECT("a game write on another page is counted", 1, (long long)nvn_dirty_since_except(span, st8, 8 * pg, stamp, (const uintptr_t (*)[2])ex, 2, &first)); + EXPECT("... and found there", 4, (long long)((first - (uintptr_t)st8) / pg)); + EXPECT("a span the write is not in: none", 0, (long long)nvn_dirty_since_except(span, st8 + 5 * pg, 3 * pg, stamp, (const uintptr_t (*)[2])ex, 2, NULL)); + EXPECT("an untracked span: SIZE_MAX", 1, nvn_dirty_since_except(NULL, &stamp, sizeof stamp, 0, NULL, 0, NULL) == SIZE_MAX); + nvn_dirty_remove_range(st8); + munmap(st8, 8 * pg); return g_fail != 0; } diff --git a/dm/gfx/tests/t_image_srgb.m b/dm/gfx/tests/t_image_srgb.m new file mode 100644 index 0000000000..e30b0958fb --- /dev/null +++ b/dm/gfx/tests/t_image_srgb.m @@ -0,0 +1,81 @@ +// An sRGB texture in an image slot is loaded and stored raw, as NVN's image loads and stores do (no sRGB conversion), while its sampled descriptor still decodes. +// Star Fox writes its upscaler's sRGB-encoded output into an RGBA8_SRGB texture through an image: through the texture's own format Metal encoded it once more. +#include "../nvn/nvn_mtl.m" +void *front_metal_layer(void) { return NULL; } +module_t *module_of(const void *p) { (void)p; return NULL; } +module_t *g_mod; int g_nmod; +void svc_thread_dump(void) {} +uint64_t now_ns(void) { return bp_now(); } +static int checks, failed; +#define CHECK(c, label) do { checks++; if (!(c)) { failed++; fprintf(stderr, "FAIL: %s\n", label); } } while (0) +static void read_bytes(id t, uint8_t *out) { + memset(out, 0, 64); + id rb = [g_dev newBufferWithLength:4 * 4 * 4 options:MTLResourceStorageModeShared]; + CHECK(rb != nil, "readback buffer made"); + if (!rb) return; + id cb = q_cb(); id b = [cb blitCommandEncoder]; + [b copyFromTexture:t sourceSlice:0 sourceLevel:0 sourceOrigin:MTLOriginMake(0, 0, 0) sourceSize:MTLSizeMake(4, 4, 1) toBuffer:rb destinationOffset:0 destinationBytesPerRow:16 destinationBytesPerImage:64]; + [b endEncoding]; [cb commit]; [cb waitUntilCompleted]; + CHECK(cb.status == MTLCommandBufferStatusCompleted, "readback completed"); + memcpy(out, rb.contents, 64); +} +// One thread: reads texel (0,0) through the image and through the sampled texture into out[0..7], writes (0.5, 0.25, 0.75, 1) to texel (1,1) through the image +static void run_kernel(id image, id sampled, float *out) { + NSError *e = nil; + id lib = [g_dev newLibraryWithSource:@"#include \nusing namespace metal;\n" + "kernel void k(texture2d im [[texture(0)]], texture2d tx [[texture(1)]], device float4 *o [[buffer(0)]]) {\n" + " o[0] = im.read(uint2(0, 0)); o[1] = tx.read(uint2(0, 0)); im.write(float4(0.5, 0.25, 0.75, 1.0), uint2(1, 1)); }\n" options:nil error:&e]; + id fn = [lib newFunctionWithName:@"k"]; + id p = fn ? [g_dev newComputePipelineStateWithFunction:fn error:&e] : nil; + CHECK(p != nil, "image kernel compiled"); + if (!p) return; + id ob = [g_dev newBufferWithLength:32 options:MTLResourceStorageModeShared]; + id cb = q_cb(); id c = [cb computeCommandEncoder]; + [c setComputePipelineState:p]; [c setTexture:image atIndex:0]; [c setTexture:sampled atIndex:1]; [c setBuffer:ob offset:0 atIndex:0]; + [c dispatchThreads:MTLSizeMake(1, 1, 1) threadsPerThreadgroup:MTLSizeMake(1, 1, 1)]; [c endEncoding]; [cb commit]; [cb waitUntilCompleted]; + CHECK(cb.status == MTLCommandBufferStatusCompleted, "image kernel completed"); + memcpy(out, ob.contents, 32); +} +static void srgb_case(int fmt, int bgra, uint64_t serial, int tid) { @autoreleasepool { + tex_t texture = {.magic = MAGIC('T', 'E', 'X', 0), .serial = serial, .off = serial << 12}; + texture.d = (nvn_texdesc){.target = NVN_TEXTURE_TARGET_2D, .format = (uint32_t)fmt, .flags = NVN_TEXTURE_FLAGS_IMAGE, .width = 4, .height = 4, .depth = 1, .levels = 1, .samples = 1}; + nvn_tex_layout(&texture.d, &texture.L); mtl_tex_init(&texture); + id base = tex_mtl(&texture); + MTLPixelFormat srgb = bgra ? MTLPixelFormatBGRA8Unorm_sRGB : MTLPixelFormatRGBA8Unorm_sRGB, lin = bgra ? MTLPixelFormatBGRA8Unorm : MTLPixelFormatRGBA8Unorm; + CHECK(base && base.pixelFormat == srgb, "the texture is made in its sRGB format"); + uint8_t seed[64] = {0}; seed[0] = seed[1] = seed[2] = 0x80; seed[3] = 0xff; // texel (0,0): stored bytes 0x80 + { id sb = [g_dev newBufferWithBytes:seed length:64 options:MTLResourceStorageModeShared]; + CHECK(sb != nil, "seed buffer made"); + if (!sb) return; + id cb = q_cb(); id b = [cb blitCommandEncoder]; + [b copyFromBuffer:sb sourceOffset:0 sourceBytesPerRow:16 sourceBytesPerImage:64 sourceSize:MTLSizeMake(4, 4, 1) toTexture:base destinationSlice:0 destinationLevel:0 destinationOrigin:MTLOriginMake(0, 0, 0)]; + [b endEncoding]; [cb commit]; [cb waitUntilCompleted]; } + mtl_reg_tex(tid, &texture, NULL); mtl_reg_image(tid + 1, &texture, NULL); + NvProg *program = [NvProg new]; NvShader *shader = [NvShader new]; program->sh[5] = shader; + shader->rf.nb = 1; shader->rf.b[0] = (nvn_rbind){.kind = NVN_RB_IMG, .dtt = MTLTextureType2D, .dpf = NVN_DPF_FLOAT, .reg = 0, .rw = 1}; + mtl_sub_begin(); memset(&R, 0, sizeof R); + S.img[5][0] = (uint32_t)(tid + 1); image_prepare(program, 0x20); + os_unfair_lock_lock(&g_rmu); + id sampled = tex_by_id(tid); uint64_t rid = 0; int real = 0; + id image = img_binding(tid + 1, &shader->rf.b[0], &rid, &real); + os_unfair_lock_unlock(&g_rmu); + mtl_sub_commit(); mtl_drain(); + CHECK(sampled && sampled.pixelFormat == srgb, "the sampled descriptor keeps the sRGB format (sampling decodes)"); + CHECK(real && image && image.pixelFormat == lin, "the image slot gets the linear twin of the sRGB format"); + CHECK(image && rid == image.gpuResourceID._impl, "the image argument names that view"); + id root = image.parentTexture ? image.parentTexture : image, sroot = sampled.parentTexture ? sampled.parentTexture : sampled; + CHECK(root == sroot && (image.usage & MTLTextureUsageShaderWrite), "the view shares the sampled texture's writable storage"); + float out[8] = {0}; if (image && sampled) run_kernel(image, sampled, out); + CHECK(fabsf(out[0] - 128.0f / 255.0f) < 1e-3f, "an image load returns the stored byte as it is"); + CHECK(fabsf(out[4] - 0.2158605f) < 2e-3f, "a sampled read of the same texel decodes it"); + uint8_t px[64]; read_bytes(root, px); + const uint8_t *t11 = px + 4 * (4 + 1); uint8_t r = bgra ? t11[2] : t11[0], g = t11[1], b = bgra ? t11[0] : t11[2]; + CHECK(r == 0x80 && g == 0x40 && b == 0xbf && t11[3] == 0xff, "an image store keeps the written value as it is (0.5 → 0x80, not 0xbc)"); +} } +int main(void) { @autoreleasepool { + mtl_init(); + srgb_case(NVN_FORMAT_RGBA8_SRGB, 0, 99901, 801); + srgb_case(NVN_FORMAT_BGRA8_SRGB, 1, 99911, 811); + printf("sRGB image loads and stores: %d checks, %d failed\n", checks, failed); + return failed != 0; +} } diff --git a/dm/gfx/tests/t_nvn.c b/dm/gfx/tests/t_nvn.c index a7b7ad8b8f..8d9c6fbf2e 100644 --- a/dm/gfx/tests/t_nvn.c +++ b/dm/gfx/tests/t_nvn.c @@ -638,6 +638,15 @@ int main(void) { EXPECT("sync signaled after acquire (0)", 0, P(nvnSyncWait)(&s2, 0)); unsigned bi = 0; while (strcmp(nvn_names[bi], "nvnCommandBufferBarrier")) bi++; EXPECT("Barrier count = 4 frames × 5", 20, nvn_slot[bi].cnt); + { // An off-screen window (a native window no display shows, dm_native_window_offscreen: GameChat's virtual camera): its frames are dropped and are not the game's frames + NVNwindow off; P(nvnWindowInitialize)(&off, &wb); ((win_t *)&off)->offscreen = 1; + uint64_t f0 = dm_nvn_frame_count(); int oi[3]; + for (int f = 0; f < 3; f++) { P(nvnWindowAcquireTexture)(&off, &s2, &oi[f]); P(nvnQueuePresentTexture)(&q, &off, oi[f]); } + EXPECT("off-screen window rotates 0,1,0", 0x010, oi[0] << 8 | oi[1] << 4 | oi[2]); + EXPECT("off-screen presents are not frames", 1, dm_nvn_frame_count() == f0); + EXPECT("off-screen acquire sync signaled (0)", 0, P(nvnSyncWait)(&s2, 0)); + EXPECT("a window of the display's native window is on screen", 0, ((win_t *)&win)->offscreen); + } // 6b. Readback: pixel (x,y) = {x*16+y, y*16+x, 0x55, 0xAA} (expected values computed directly from the formula) { diff --git a/dm/gfx/tests/t_readback.m b/dm/gfx/tests/t_readback.m index 0b05bfffef..e916493be1 100644 --- a/dm/gfx/tests/t_readback.m +++ b/dm/gfx/tests/t_readback.m @@ -344,6 +344,83 @@ static void stale_pools(void) { h_nvnMemoryPoolFinalize(mp2); munmap(phys, len); free(mp); free(mp2); free(sp); } +// A texture the host uploads from its storage, filled by GPU copies a level of a layer at a time, as Star Fox streams its textures into BC7 arrays: each copy's bytes are written into +// the storage and, on the GPU, into the host texture, so none of them uploads the texture again (pkg_copy_absorb); a CPU write into it still does, before a copy, after one, and +// between a copy's write into the storage and its absorption. Every level of every layer holds one byte value, so its layout does not matter +void crash_install(void); +static void copy_stream(void) { @autoreleasepool { + crash_install(); // the game's writes into protected storage go through the page-fault hook, as in production + enum { W = 64, LAYERS = 4, LEVELS = 3, POOL = 1 << 20, OFF = 0x11000, SRC = 0x80000, OUT = 0xC0000 }; // OFF: 4 KB into a 16 KB host page, whose first 4 KB is other data + void *mem = NULL; if (posix_memalign(&mem, getpagesize(), POOL)) abort(); memset(mem, 0, POOL); + uint8_t *m = mem; + pool_t pool = {.magic=MAGIC('P','O','O','L'), .mem=mem, .size=POOL}; mtl_pool_add(mem, POOL); nvn_dirty_add_range(mem, POOL); + NVNtextureBuilder tb; h_nvnTextureBuilderSetDefaults(&tb); h_nvnTextureBuilderSetTarget(&tb, NVN_TEXTURE_TARGET_2D_ARRAY); + h_nvnTextureBuilderSetWidth(&tb, W); h_nvnTextureBuilderSetHeight(&tb, W); h_nvnTextureBuilderSetDepth(&tb, LAYERS); h_nvnTextureBuilderSetLevels(&tb, LEVELS); + h_nvnTextureBuilderSetFormat(&tb, NVN_FORMAT_RGBA8); + NVNpackagedTextureLayout lay = {{1, 0, 0, 0, 7, 0, 1, 0}}; h_nvnTextureBuilderSetPackagedTextureLayout(&tb, &lay); + h_nvnTextureBuilderSetStorage(&tb, (const NVNmemoryPool *)&pool, OFF); + NVNtexture arr; EXPECT("streamed array init", 1, h_nvnTextureInitialize(&arr, &tb)); + const tex_t *t = (const tex_t *)&arr; + EXPECT("streamed array fits before the copy source", 1, OFF + t->L.size <= SRC); + memset(m + OFF, 0x11, t->L.size); + uint64_t lo[LAYERS][LEVELS], hi[LAYERS][LEVELS]; + for (int z = 0; z < LAYERS; z++) for (int l = 0; l < LEVELS; l++) nvn_tex_level_range(t, (unsigned)l, (unsigned)z, &lo[z][l], &hi[z][l]); + tex_mtl(t); + uint64_t r0 = g_pkg_reuploads, a0 = g_pkg_copy_absorbs; + memset(m + OFF + lo[3][0], 0x77, hi[3][0] - lo[3][0]); // the game writes layer 3's level 0 before the copies: uploaded once, at the first copy's lookup + NVNcommandBuffer cmd; EXPECT("stream command init", 1, h_nvnCommandBufferInitialize(&cmd, NULL)); + h_nvnCommandBufferAddCommandMemory(&cmd, (const NVNmemoryPool *)&pool, 0, 65536); + h_nvnCommandBufferBeginRecording(&cmd); + h_nvnCommandBufferSetCopyRowStride(&cmd, 0); h_nvnCommandBufferSetCopyImageStride(&cmd, 0); + size_t so = SRC, oo = OUT, out_at[LAYERS][LEVELS]; + for (int z = 0; z < 3; z++) for (int l = 0; l < LEVELS; l++) { // layers 0-2, every level, one copy each + int w = W >> l; NVNtextureView v; h_nvnTextureViewSetDefaults(&v); h_nvnTextureViewSetLevels(&v, l, 1); + memset(m + so, 0x40 + z * 8 + l, (size_t)w * w * 4); + NVNcopyRegion r = {0, 0, z, w, w, 1}; h_nvnCommandBufferCopyBufferToTexture(&cmd, (NVNbufferAddress)(m + so), &arr, &v, &r, 0); + so += (size_t)w * w * 4; + } + for (int z = 0; z < LAYERS; z++) for (int l = 0; l < LEVELS; l++) { // the host texture's content, read on the GPU + int w = W >> l; NVNtextureView v; h_nvnTextureViewSetDefaults(&v); h_nvnTextureViewSetLevels(&v, l, 1); + NVNcopyRegion r = {0, 0, z, w, w, 1}; out_at[z][l] = oo; memset(m + oo, 0xEE, (size_t)w * w * 4); + h_nvnCommandBufferCopyTextureToBuffer(&cmd, &arr, &v, &r, (NVNbufferAddress)(m + oo), 0); + oo += (size_t)w * w * 4; + } + NVNsync sync; h_nvnSyncInitialize(&sync, NULL); + h_nvnCommandBufferFenceSync(&cmd, &sync, NVN_SYNC_CONDITION_ALL_GPU_COMMANDS_COMPLETE, 0); + NVNcommandHandle h = h_nvnCommandBufferEndRecording(&cmd); + state_reset(); memset(&R, 0, sizeof R); mtl_sub_begin(); mtl_exec((const uint8_t *)h); mtl_sub_commit(); + int wait = h_nvnSyncWait(&sync, 5000000000ull); EXPECT("stream fence wait", 1, wait == 0 || wait == 1); + EXPECT("stream GPU success", 0, mtl_last_commit_error()); + EXPECT("9 copies into a texture uploaded from its storage: one re-upload (the CPU write before them)", 1, (int)(g_pkg_reuploads - r0)); + EXPECT("... and the 9 copies taken without one", 9, (int)(g_pkg_copy_absorbs - a0)); + int bad = 0; + for (int z = 0; z < LAYERS; z++) for (int l = 0; l < LEVELS; l++) { + int w = W >> l; uint8_t want = z < 3 ? (uint8_t)(0x40 + z * 8 + l) : l ? 0x11 : 0x77; + for (size_t i = 0; i < (size_t)w * w * 4; i++) bad += m[out_at[z][l] + i] != want; + for (uint64_t i = lo[z][l]; i < hi[z][l]; i++) bad += m[OFF + i] != want; // the storage too (each level holds one value: layout padding as well) + } + EXPECT("host texture and storage hold every copy and the CPU write, every byte", 0, bad); + uint64_t r1 = g_pkg_reuploads; m[OFF + lo[0][2] + 5] = 0x99; tex_mtl(t); + EXPECT("a CPU write after the copies: uploaded again", 1, (int)(g_pkg_reuploads - r1)); + // Inside a copy: its bytes written into the storage, then a CPU write elsewhere in the texture before the absorption (another thread, during the replay): not absorbed, uploaded + NvPkg *pk = tex_get(t->serial); id host = tex_mtl(t); EXPECT("streamed array is a packaged record", 1, [pk isKindOfClass:[NvPkg class]] && host == pk->tex); + NVNcopyRegion r1v = {0, 0, 0, W / 2, W / 2, 1}; uint8_t lvl1[(W / 2) * (W / 2) * 4]; memset(lvl1, 0x55, sizeof lvl1); + EXPECT("mirror of a level 1 copy into layer 0", 0, nvn_tex_mirror_b2t(t, 1, 0, &r1v, lvl1, (W / 2) * 4, sizeof lvl1)); + m[OFF + lo[2][0] + 3] = 0x66; + EXPECT("a CPU write beside the copy's level: not absorbed", 0, pkg_copy_absorb(t, host, 1, 0, 1)); + uint64_t r2 = g_pkg_reuploads; tex_mtl(t); EXPECT("... uploaded at the next use", 1, (int)(g_pkg_reuploads - r2)); + // Other data in the texture's first host page written (a neighbour): the texture's own bytes there are unchanged, so a copy elsewhere is absorbed; a write into them is not + host = tex_mtl(t); m[OFF - 0x800] = 0x12; + EXPECT("mirror of a level 1 copy into layer 2", 0, nvn_tex_mirror_b2t(t, 1, 2, &r1v, lvl1, (W / 2) * 4, sizeof lvl1)); + EXPECT("a neighbour's write in the shared first page: absorbed", 1, pkg_copy_absorb(t, host, 1, 2, 1)); + uint64_t r3 = g_pkg_reuploads; EXPECT("... not uploaded again", 1, tex_mtl(t) == host && g_pkg_reuploads == r3); + EXPECT("mirror of a level 1 copy into layer 1", 0, nvn_tex_mirror_b2t(t, 1, 1, &r1v, lvl1, (W / 2) * 4, sizeof lvl1)); + m[OFF + 0x100] ^= 0xff; // layer 0's level 0, in the shared first page: the texture's own bytes + EXPECT("a CPU write into the texture's bytes in its first page: not absorbed", 0, pkg_copy_absorb(t, host, 1, 1, 1)); + tex_mtl(t); EXPECT("... uploaded at the next use", 1, (int)(g_pkg_reuploads - r3)); + h_nvnTextureFinalize(&arr); nvn_dirty_remove_range(mem); mtl_pool_del(mem); free(mem); +} } + int main(void) { @autoreleasepool { alarm(60); if (setvbuf(stdout, NULL, _IONBF, 0)) abort(); // GPU, callback and pthread failures must not leave the check target hanging. mtl_init(); @@ -445,6 +522,7 @@ int main(void) { @autoreleasepool { stale_pools(); packed_copies(NVN_FORMAT_RGB565, 500); packed_copies(NVN_FORMAT_RGB5A1, 501); packed_copies(NVN_FORMAT_RGB5, 502); packed_copies(NVN_FORMAT_RGBA4, 503); mirror_completion(); + copy_stream(); readback_pool(); printf("READBACK cases=%d failed=%d\n", cases, failed); return failed != 0; } } diff --git a/dm/host/hle.h b/dm/host/hle.h index a28fee0346..16608059a7 100644 --- a/dm/host/hle.h +++ b/dm/host/hle.h @@ -21,6 +21,7 @@ uint64_t now_ns(void); // A blocking native HLE wait releases the guest core. With the condition mutex // held, enter with 1 before waiting and balance with 0 after reacquiring it. void dm_thread_native_wait(int entering); +int dm_native_window_offscreen(const void *native); // hle_misc.c: a native window no display shows (GameChat's virtual camera); hle_nvn.c drops the frames of its NVN windows void dm_thread_service_connect(void); // an HLE call that stands for connecting to a service on Horizon: threads started so far get to run (hle_thread.c) void dm_thread_service_request(void); // an HLE call that is a blocking service request on Horizon: the caller gives up its core (hle_thread.c) uint64_t guest_ns(void); // Guest clock (hle_os.c; does not advance while frozen, guest_clock_freeze) diff --git a/dm/host/hle_misc.c b/dm/host/hle_misc.c index 58770677cb..995f941e74 100644 --- a/dm/host/hle_misc.c +++ b/dm/host/hle_misc.c @@ -306,8 +306,13 @@ HLE_FORCE("_ZN2nn4chat21FinalizeVirtualCameraEPNS0_17VirtualCameraTypeE", "GameC HLE_FORCE("_ZN2nn4chat19EnableVirtualCameraEPNS0_17VirtualCameraTypeE", "GameChat virtual camera enabled: nothing to show it to", Result, h_chat_VcamOn, void *cam) { (void)cam; return RES_OK; } HLE_FORCE("_ZN2nn4chat20DisableVirtualCameraEPNS0_17VirtualCameraTypeE", "GameChat virtual camera disabled", Result, h_chat_VcamOff, void *cam) { (void)cam; return RES_OK; } HLE_FORCE("_ZN2nn4chat43SetVirtualCameraContainPhotographedContentsEPNS0_17VirtualCameraTypeEb", "GameChat virtual camera flag: kept nowhere", void, h_chat_VcamPhoto, void *cam, unsigned on) { (void)cam; (void)on; } -HLE_FORCE("_ZN2nn4chat34GetVirtualCameraNativeWindowHandleEPKNS0_17VirtualCameraTypeE", "GameChat virtual camera window: none", uint64_t, h_chat_VcamWindow, const void *cam) { - (void)cam; static int once; if (!once++) LOG("chat: GetVirtualCameraNativeWindowHandle: no window (0)"); return 0; +// The virtual camera's window: Star Fox makes an NVN window of it (main+0xba540a0, no check for 0) and presents its avatar picture into it, in its avatar settings. The host shows +// every window it is given; this one is the host's off-screen native window, whose NVN windows drop their frames and do not pace the game (dm_native_window_offscreen, hle_nvn.c) +static char g_vcam_native; +int dm_native_window_offscreen(const void *native) { return native == &g_vcam_native; } +HLE_FORCE("_ZN2nn4chat34GetVirtualCameraNativeWindowHandleEPKNS0_17VirtualCameraTypeE", "GameChat virtual camera window: an off-screen one (nobody receives it)", uint64_t, h_chat_VcamWindow, + const void *cam) { + (void)cam; return (uint64_t)(uintptr_t)&g_vcam_native; } HLE_FORCE("_ZN2nn4chat25StartLocalCameraStreamingEv", "GameChat local camera streaming: no camera, nothing streams", Result, h_chat_LocalStart, void) { return RES_OK; } HLE_FORCE("_ZN2nn4chat24StopLocalCameraStreamingEv", "GameChat local camera streaming stopped", Result, h_chat_LocalStop, void) { return RES_OK; } diff --git a/dm/host/hle_oe.c b/dm/host/hle_oe.c index a079a02935..a4fed7da6a 100644 --- a/dm/host/hle_oe.c +++ b/dm/host/hle_oe.c @@ -287,11 +287,16 @@ static unsigned char g_cpu_oc; HLE_FORCE("_ZN2nn2oe21IsCpuOverclockEnabledEv", "CPU overclock state (through apm): what SetCpuOverclockEnabled set, off at start", unsigned, h_oe_CpuOc, void) { return g_cpu_oc; } HLE_FORCE("_ZN2nn2oe22SetCpuOverclockEnabledEb", "CPU overclock switch (through apm); the host does not scale clocks", void, h_oe_SetCpuOc, unsigned on) { g_cpu_oc = on & 0xff; } // Switch 2 SDKs: the graphics scale, which the SDK takes from am's IGraphicsScalingParametersFunctions (a session the host never opened: null read in -// oe::GetGraphicsScalingParameters). The SDK maps the parameter's first word 10 / 20 / 30 to scale 0 / 1 / 2. Donkey Kong Bananza keeps it as a quality tier: a byte of its graphics -// settings (+0x1c7, main+0x549348, next to the handheld flag it takes from the operation mode at +0x1c4), and an index into {3, 12, 16} (main+0x1d1a604) whose value less 3 (0, 9, 13) -// goes to a renderer parameter (main+0x549614). Which tier the console reports in which mode is not measured: the host answers 0 handheld and 1 console, following the operation mode -HLE_FORCE("_ZN2nn2oe23GetCurrentGraphicsScaleEv", "graphics scale (Switch 2, through am): 0 handheld, 1 console", int, h_oe_GfxScale, void) { return opmode() == 1; } -HLE_FORCE("_ZN2nn2oe42SetGraphicsScaleChangedNotificationEnabledEb", "graphics scale change notification (Switch 2, through am); the scale changes only with the operation mode", +// oe::GetGraphicsScalingParameters). The SDK maps the parameter's first word 10 / 20 / 30 to scale 0 / 1 / 2. It is the share of the GPU the system leaves the game, not the +// operation mode: tier 0 is all of it, 1 and 2 less (as while the system runs GameChat's video, which the host never does), and a game shrinks its picture and its GPU budget +// to match. Donkey Kong Bananza takes it as its display manager's scale index (+0x1c7, main+0x549348): its frame buffer is the display's size times {1.0, 0.8, 2/3}[tier] +// (main+0x30f840), and as an index into {3, 12, 16} (main+0x1d1a604) whose value less 3 (0, 9, 13) its dynamic resolution takes into its GPU time (main+0x549614). Star Fox +// keeps only "tier 0" (byte +0xa of its event 5, main+0xba69970) and renders 0.8 times smaller below it: docked, 768x432 for its 1920x1080 window where tier 0 gives 960x540, +// smaller than its 960x540 handheld on a GPU twice as fast; console footage matches tier 0. The host answered 1 docked until it was found so. DM_GFX_SCALE sets a tier to +// reproduce a reduced share +static int gfx_scale(void) { const char *e = getenv("DM_GFX_SCALE"); int v = e ? atoi(e) : 0; return v >= 0 && v <= 2 ? v : 0; } +HLE_FORCE("_ZN2nn2oe23GetCurrentGraphicsScaleEv", "graphics scale (Switch 2, through am): 0, the whole GPU (DM_GFX_SCALE sets 1 or 2)", int, h_oe_GfxScale, void) { return gfx_scale(); } +HLE_FORCE("_ZN2nn2oe42SetGraphicsScaleChangedNotificationEnabledEb", "graphics scale change notification (Switch 2, through am); the host's scale never changes", void, h_oe_GfxScaleNotify, unsigned on) { (void)on; } // The frame length the game aims at (Switch 2 SDKs): oe::SetGraphicsTargetFrameRate maps up to 59 fps to mode 1, up to 119 to mode 2 and above to mode 3, SetGraphicsTargetFrameRateAuto // to mode 0, and both call this, which locks the gs graphics server's context and sends it the mode. The host has no graphics server (nv::InitializeGraphics), so the context is null and diff --git a/dm/host/loader.c b/dm/host/loader.c index 26d68822ac..963bbcdd8d 100644 --- a/dm/host/loader.c +++ b/dm/host/loader.c @@ -312,6 +312,12 @@ void dm_fps_state_apply(void) { const char *rs = getenv("DM_RENDER_SCALE"); float sc = 1.0f; if (rs) { char *end; sc = strtof(rs, &end); if (end == rs || *end || !(sc >= 0.5f && sc <= 1.0f)) { LOG("[RED] DM_RENDER_SCALE=%s: must be 0.5 to 1.0; keeping the game's size", rs); sc = 1.0f; } else LOG("%s: 3D views rendered at %.2f of the game's size (DM_RENDER_SCALE)", g_fps_mod, sc); } memcpy(dm_fps_state + 0x10, &sc, sizeof sc); + // Scene resolution scale (StarFox's patches.py: the stub at main+0xb4498ac): the share of the target the game renders its scene at, in place of the scale from its settings + // (0.5 docked, 0.83 handheld). DM_RESOLUTION_SCALE, 0.25 to 1.0; 0 or unset = the game's own. Only builds with that stub read it + const char *qs = getenv("DM_RESOLUTION_SCALE"); float q = 0; + if (qs && *qs) { char *end; q = strtof(qs, &end); if (end == qs || *end || !(q == 0 || (q >= 0.25f && q <= 1.0f))) { LOG("[RED] DM_RESOLUTION_SCALE=%s: must be 0 or 0.25 to 1.0; keeping the game's scale", qs); q = 0; } + else if (q > 0) LOG("%s: scene rendered at %.2f of the target (DM_RESOLUTION_SCALE; only builds with that stub follow it)", g_fps_mod, q); } + memcpy(dm_fps_state + 0xa0, &q, sizeof q); // Screen shape: DM_SCREEN_ASPECT, the screen's width / height between 1.3 and 1.77, makes the builds with screen-shape stubs // (Breath of the Wild 1.9.0's patches.py) render that shape: the output keeps its width (1920) and takes the height that gives the ratio, a multiple of 48 so the // 2/3-size layout space (1280 wide) stays whole: 1.43 → 1920x1344 and 1280x896. State +0x48 u32 output height, +0x4c u32 layout height, +0x50 its float; 0 = 16:9 diff --git a/dm/host/probe.c b/dm/host/probe.c index b6dc4c461b..cb1f7e82ce 100644 --- a/dm/host/probe.c +++ b/dm/host/probe.c @@ -130,6 +130,7 @@ static int probe_hit(ucontext_t *uc) { // Registered by probe_install with the for (int r = 0; r < 8; r++) { uint64_t v = uc->uc_mcontext->__ss.__x[r]; fprintf(stderr, " x%d=%#llx", r, v); probe_str(v); } for (int r = 19; r < 24; r++) fprintf(stderr, " x%d=%#llx", r, uc->uc_mcontext->__ss.__x[r]); if (getenv("DM_PROBE_ALL")) for (int r = 8; r < 19; r++) fprintf(stderr, " x%d=%#llx", r, uc->uc_mcontext->__ss.__x[r]); // also print x8–x18 + if (getenv("DM_PROBE_FP")) for (int r = 0; r < 16; r++) { float f; memcpy(&f, &uc->uc_mcontext->__ns.__v[r], 4); fprintf(stderr, " s%d=%g", r, (double)f); } // s0–s15: the low 32 bits of v0–v15 as floats fprintf(stderr, " lr=%#llx", uc->uc_mcontext->__ss.__lr); { uint64_t x8 = uc->uc_mcontext->__ss.__x[8]; Dl_info di; fprintf(stderr, " x8=%#llx", x8); // x8: indirect call targets are often here (probe placed before blr x8) if (dladdr((void *)x8, &di) && di.dli_sname) fprintf(stderr, " (%s+%#lx)", di.dli_sname, (unsigned long)(x8 - (uint64_t)di.dli_saddr)); } @@ -279,14 +280,18 @@ static int watch_fault(void *addr, int is_write, void *ucv) { mprotect((void *)g_wpg, g_wpsz, PROT_READ | PROT_WRITE); atomic_store(&g_warmed, 0); return 1; } -static uint64_t g_wrel; static int g_wheap; // heap+: the address is that far past the guest heap's base, resolved once the game opens its heap +static uint64_t g_wrel; static int g_wheap; // 1 heap+: the address is that far past the guest heap's base, resolved once the game opens its heap; 2 as+: past the + // guest address space's base, which moves from run to run (an object outside the heap, such as one in the game's mapped memory) static void *watch_arm(void *p) { (void)p; for (;;) { if (g_wheap && !g_wat) { - uint64_t hb = 0; dm_guest_heap_range(&hb, NULL); if (!hb) { usleep(1000); continue; } + uint64_t hb = 0; + if (g_wheap == 2) { void svc_guest_range(uint8_t **base, size_t *size); uint8_t *b = NULL; size_t n = 0; svc_guest_range(&b, &n); hb = (uint64_t)(uintptr_t)b; } + else dm_guest_heap_range(&hb, NULL); + if (!hb) { usleep(1000); continue; } g_wpg = (hb + g_wrel) & ~(g_wpsz - 1); g_wat = hb + g_wrel; - LOG("write watch on heap %#llx + %#llx = %#llx", (unsigned long long)hb, (unsigned long long)g_wrel, (unsigned long long)g_wat); + LOG("write watch on %s %#llx + %#llx = %#llx", g_wheap == 2 ? "address space" : "heap", (unsigned long long)hb, (unsigned long long)g_wrel, (unsigned long long)g_wat); } if (g_wat && !atomic_load(&g_warmed)) { mach_vm_address_t ra = g_wpg; mach_vm_size_t rs = 0; vm_region_basic_info_data_64_t bi; mach_msg_type_number_t cnt = VM_REGION_BASIC_INFO_COUNT_64; mach_port_t obj; @@ -336,7 +341,8 @@ static void poll_snap(void) { static void *poll_run(void *p) { (void)p; void svc_thread_dump(void); extern uint64_t g_t0_ns; uint64_t now_ns(void); vm_size_t got; uint64_t old = 0; // read through the kernel: the address is not readable until the game maps it (the heap before SetHeapSize) - if (g_pheap) { uint64_t hb = 0; while (dm_guest_heap_range(&hb, NULL), !hb) usleep(1000); g_poll += hb; } // heap+ + if (g_pheap == 1) { uint64_t hb = 0; while (dm_guest_heap_range(&hb, NULL), !hb) usleep(1000); g_poll += hb; } // heap+ + if (g_pheap == 2) { void svc_guest_range(uint8_t **base, size_t *size); uint8_t *b = NULL; size_t n = 0; while (svc_guest_range(&b, &n), !b) usleep(1000); g_poll += (uint64_t)(uintptr_t)b; } // as+ while (vm_read_overwrite(mach_task_self(), g_poll, g_plen, (vm_address_t)&old, &got) || got != g_plen) usleep(1000); LOG("POLL %#llx + %llu armed, value %#llx", (unsigned long long)g_poll, (unsigned long long)g_plen, (unsigned long long)old); for (int n = 0;;) { @@ -352,20 +358,20 @@ static void *poll_run(void *p) { } static void watch_install(void) { { const char *e = getenv("DM_PROBE_POLL"); - if (e) { char *end; g_pheap = !strncmp(e, "heap+", 5); if (g_pheap) e += 5; g_poll = strtoull(e, &end, 16); g_plen = *end == '+' ? strtoull(end + 1, &end, 16) : 4; + if (e) { char *end; g_pheap = !strncmp(e, "heap+", 5) ? 1 : !strncmp(e, "as+", 3) ? 2 : 0; e += g_pheap == 1 ? 5 : g_pheap == 2 ? 3 : 0; g_poll = strtoull(e, &end, 16); g_plen = *end == '+' ? strtoull(end + 1, &end, 16) : 4; if (*end == '=') { g_pwant = 1; g_pval = strtoull(end + 1, 0, 16); } - if ((!g_poll && !g_pheap) || !g_plen || g_plen > 8) die("DM_PROBE_POLL format:
[+][=] (hex)"); + if ((!g_poll && !g_pheap) || !g_plen || g_plen > 8) die("DM_PROBE_POLL format: [heap+|as+]
[+][=] (hex)"); pthread_t t; pthread_create(&t, NULL, poll_run, NULL); pthread_detach(t); } } const char *e = getenv("DM_PROBE_WATCH"); if (!e) return; - char *end; g_wheap = !strncmp(e, "heap+", 5); - uint64_t at = strtoull(e + (g_wheap ? 5 : 0), &end, 16); g_wlen = *end == '+' ? strtoull(end + 1, 0, 16) : 8; - if ((!at && !g_wheap) || !g_wlen) die("DM_PROBE_WATCH format: [heap+]
[+] (hex)"); + char *end; g_wheap = !strncmp(e, "heap+", 5) ? 1 : !strncmp(e, "as+", 3) ? 2 : 0; + uint64_t at = strtoull(e + (g_wheap == 1 ? 5 : g_wheap == 2 ? 3 : 0), &end, 16); g_wlen = *end == '+' ? strtoull(end + 1, 0, 16) : 8; + if ((!at && !g_wheap) || !g_wlen) die("DM_PROBE_WATCH format: [heap+|as+]
[+] (hex)"); g_wpsz = (uint64_t)getpagesize(); if ((at & (g_wpsz - 1)) + g_wlen > g_wpsz) die("DM_PROBE_WATCH: the watched bytes must lie in one host page"); if (g_wheap) { g_wrel = at; g_wpg = 0; } else { g_wat = at; g_wpg = g_wat & ~(g_wpsz - 1); } dm_fault_hook_register(watch_fault); pthread_t t; pthread_create(&t, NULL, watch_arm, NULL); pthread_detach(t); - if (g_wheap) LOG("write watch on heap + %#llx + %#llx (resolved once the game opens its heap)", (unsigned long long)g_wrel, (unsigned long long)g_wlen); + if (g_wheap) LOG("write watch on %s + %#llx + %#llx (resolved once the game opens it)", g_wheap == 2 ? "the address space" : "the heap", (unsigned long long)g_wrel, (unsigned long long)g_wlen); else LOG("write watch on %#llx + %#llx (host page %#llx)", (unsigned long long)g_wat, (unsigned long long)g_wlen, (unsigned long long)g_wpg); } diff --git a/dm/host/tests/Makefile b/dm/host/tests/Makefile index 307d60221c..38b7188b7a 100644 --- a/dm/host/tests/Makefile +++ b/dm/host/tests/Makefile @@ -12,12 +12,13 @@ QUIET = $(if $(findstring -fsanitize,$(SAN)),,2>/dev/null) GINC = $(if $(strip $(GAME)),-I../gen/$(GAME) -I../../games/$(GAME),$(error GAME is not set: make GAME=: $(shell python3 ../../games/game.py list | awk -F'\t' '{printf "%s (%s) ", $$1, $$3}'))) $(B)/t_fs $(B)/t_fs_case $(B)/t_fs_commit_list $(B)/t_fs_commit_list_tsan: ../romfs_image.h GAME_H = ../gen/$(GAME)/game_profile.h -run: $(B)/t_language $(B)/t_motion $(B)/t_heap_size $(B)/t_touch $(B)/t_gesture $(B)/t_oe $(B)/t_fs $(B)/t_fs_commit_list $(B)/t_thread_leak $(B)/t_fs_case $(B)/t_audio $(B)/t_output_stream $(B)/t_audio_spsc $(B)/t_swkbd $(B)/t_altstack $(B)/t_condvar $(B)/t_condvar_old $(B)/t_pollwait $(B)/t_pctl $(B)/t_sf $(B)/t_time $(B)/t_shared_font $(B)/t_vorbis $(B)/t_vorbis_divides $(B)/t_hid $(B)/t_haptics $(B)/t_haptics_apple $(B)/t_cheats $(B)/t_pad_hid +run: $(B)/t_language $(B)/t_motion $(B)/t_heap_size $(B)/t_touch $(B)/t_gesture $(B)/t_oe $(B)/t_vi_display $(B)/t_fs $(B)/t_fs_commit_list $(B)/t_thread_leak $(B)/t_fs_case $(B)/t_audio $(B)/t_output_stream $(B)/t_audio_spsc $(B)/t_swkbd $(B)/t_altstack $(B)/t_condvar $(B)/t_condvar_old $(B)/t_pollwait $(B)/t_pctl $(B)/t_sf $(B)/t_time $(B)/t_shared_font $(B)/t_vorbis $(B)/t_vorbis_divides $(B)/t_hid $(B)/t_haptics $(B)/t_haptics_apple $(B)/t_cheats $(B)/t_pad_hid $(B)/t_language $(B)/t_heap_size $(B)/t_touch $(B)/t_gesture $(B)/t_oe $(QUIET) + $(B)/t_vi_display $(B)/t_fs $(QUIET) TMPDIR="$(abspath $(B))" $(B)/t_fs_commit_list $(B)/t_thread_leak @@ -231,6 +232,8 @@ $(B)/t_time: t_time.c ../hle_time.c ../hle.h ../dm.h $(GAME_H) | $(B) $(CLANG) -O1 -Wall -Werror -Wno-unused-function -I.. $(GINC) -o $@ t_time.c $(B)/t_oe: t_oe.c ../hle_oe.c ../hle.h ../dm.h $(GAME_H) | $(B) $(CLANG) -O1 -Wno-unused-function -I.. $(GINC) -o $@ t_oe.c +$(B)/t_vi_display: t_vi_display.c t_vi_display_front.c ../../gfx/hle_vi.c ../hle.h ../dm.h $(GAME_H) | $(B) + $(CLANG) -O1 -Wall -Werror -Wno-unused-function -I.. $(GINC) -o $@ t_vi_display.c t_vi_display_front.c $(B)/t_condvar: t_condvar.c t_condvar_stub.c ../hle_thread.c ../dm.h $(GAME_H) | $(B) $(CLANG) -O1 -Wno-unused-function -DDM_TEST_HOOKS -I.. $(GINC) -o $@ t_condvar.c t_condvar_stub.c ../hle_thread.c $(B)/t_condvar_old: t_condvar.c t_condvar_stub.c ../hle_thread.c ../dm.h $(GAME_H) | $(B) diff --git a/dm/host/tests/t_nro.c b/dm/host/tests/t_nro.c index 4c28d50b10..d40347c41b 100644 --- a/dm/host/tests/t_nro.c +++ b/dm/host/tests/t_nro.c @@ -1,6 +1,7 @@ // Synthetic modules exercise real relocation and nn::ro calls; no game files or executable guest code required. #include "../loader.c" void dm_thread_service_connect(void) {} // threads started so far have nothing to wait for here +void mtl_present_screen(uint32_t w, uint32_t h) { (void)w; (void)h; } // no display in this loader fixture #include "../hle_ro.c" #include #include diff --git a/dm/host/tests/t_oe.c b/dm/host/tests/t_oe.c index 89c4ac695c..18d034c695 100644 --- a/dm/host/tests/t_oe.c +++ b/dm/host/tests/t_oe.c @@ -155,5 +155,10 @@ int main(void) { h_oe_SetFocusMode(3); dm_applet_enter("test"); CHECK(empty() && h_oe_GetFocus() == 2, "focus mode 3: an applet changes the state without a notification"); dm_applet_leave(); CHECK(empty() && h_oe_GetFocus() == 1, "focus mode 3: back to 1 without a notification"); + // the graphics scale is the GPU share the system leaves the game, not the operation mode: tier 0 in both modes; DM_GFX_SCALE picks a reduced tier, nonsense keeps 0 + unsetenv("DM_GFX_SCALE"); dm_set_opmode(1); CHECK(h_oe_GfxScale() == 0, "graphics scale docked: tier 0 (the whole GPU)"); + dm_set_opmode(0); CHECK(h_oe_GfxScale() == 0, "graphics scale handheld: tier 0"); + setenv("DM_GFX_SCALE", "2", 1); CHECK(h_oe_GfxScale() == 2, "DM_GFX_SCALE=2: tier 2"); + setenv("DM_GFX_SCALE", "7", 1); CHECK(h_oe_GfxScale() == 0, "DM_GFX_SCALE=7: no such tier, 0"); unsetenv("DM_GFX_SCALE"); printf("== oe %d checks, %d failed ==\n", checks, fails); return fails != 0; } diff --git a/dm/host/tests/t_pctl.c b/dm/host/tests/t_pctl.c index 08cc57c8c0..92e93959da 100644 --- a/dm/host/tests/t_pctl.c +++ b/dm/host/tests/t_pctl.c @@ -71,6 +71,10 @@ int main(void) { linit(local, 4000, 216, 3, NULL, n); CHECK(blanks_live == 0 && !limg(local, 0), "a size out of the SDK's range makes no image"); } + // GameChat's virtual camera window: the host's off-screen native window, not 0 (Star Fox makes an NVN window of any handle) + uint64_t (*vwin)(const void *) = hook("_ZN2nn4chat34GetVirtualCameraNativeWindowHandleEPKNS0_17VirtualCameraTypeE"); + if (vwin) { uint64_t nw = vwin(NULL); CHECK(nw && dm_native_window_offscreen((const void *)(uintptr_t)nw), "the virtual camera's native window is the off-screen one"); } + CHECK(!dm_native_window_offscreen(NULL), "a display's native window is not off-screen"); CHECK(unexpected == 0, "no guest symbol lookup or event binding"); printf("pctl: %d checks, %d failed\n", checks, fails); return fails != 0; diff --git a/dm/host/tests/t_symbols.c b/dm/host/tests/t_symbols.c index 6ccace4d76..4a230e02ef 100644 --- a/dm/host/tests/t_symbols.c +++ b/dm/host/tests/t_symbols.c @@ -20,6 +20,7 @@ static uint8_t *test_section(const struct mach_header_64 *mh, const char *seg, c #define getsectiondata test_section #include "../hle.c" #include "../loader.c" +void mtl_present_screen(uint32_t w, uint32_t h) { (void)w; (void)h; } // no display in this symbol fixture #undef getsectiondata struct dm_flags g_flag; diff --git a/dm/host/tests/t_vi_display.c b/dm/host/tests/t_vi_display.c new file mode 100644 index 0000000000..19dbb45b03 --- /dev/null +++ b/dm/host/tests/t_vi_display.c @@ -0,0 +1,29 @@ +// The display a game is told of (hle_vi.c): the largest display buffer (QueryDisplayBufferMaxResolution) and the largest layer ListDisplays gives, handheld and docked on +// screens of a few sizes, for a Switch 2 build and a Switch 1 one. Expectations written by hand: a Switch 1's layer is 1920x1080; a Switch 2's is the largest buffer +#include "../../gfx/hle_vi.c" +static int g_mode = 1, g_ounce = 1; +extern int g_w, g_h; // the screen front_display_pixels reports (t_vi_display_front.c, its own file: hle_vi.c has a weak one) +int dm_opmode(void) { return g_mode; } +int dm_sdk_ounce(void) { return g_ounce; } +static int checks, fails; +#define CHECK(c, s) do { checks++; int ok = !!(c); fails += !ok; printf("%s %s\n", ok ? "\xe2\x9c\x93" : "\xe2\x9c\x97", s); } while (0) +static int layer(uint64_t *w, uint64_t *h) { + uint8_t p[0x60]; int n = h_vi_ListDisp(p, 1); memcpy(w, p + 0x50, 8); memcpy(h, p + 0x58, 8); + return n == 1 && !strcmp((char *)p, "Default") && p[0x40] == 1; +} +int main(void) { + struct { int mode, ounce, w, h; uint32_t buf; uint64_t lw, lh; const char *what; } c[] = { + {1, 1, 5120, 2880, 3, 3840, 2160, "Switch 2 docked on a 5K screen: 4K buffer and layer"}, + {1, 1, 2560, 1440, 2, 2560, 1440, "Switch 2 docked on a 1440p screen: 1440p"}, + {1, 1, 1600, 1000, 0, 1280, 720, "Switch 2 docked on a screen below 1080p tall: 720p"}, + {1, 1, 0, 0, 1, 1920, 1080, "Switch 2 docked, screen not known: 1080p"}, + {0, 1, 5120, 2880, 1, 1920, 1080, "Switch 2 handheld: its own 1080p screen"}, + {1, 0, 5120, 2880, 3, 1920, 1080, "Switch 1 docked on a 5K screen: a 1080p layer"}, + }; + for (unsigned i = 0; i < sizeof c / sizeof *c; i++) { + g_mode = c[i].mode; g_ounce = c[i].ounce; g_w = c[i].w; g_h = c[i].h; + uint32_t b = 99; uint64_t w = 0, h = 0; + CHECK(h_vi_BufMaxRes(&b, NULL) == RES_OK && b == c[i].buf && layer(&w, &h) && w == c[i].lw && h == c[i].lh, c[i].what); + } + printf("== vi display %d checks, %d failed ==\n", checks, fails); return fails != 0; +} diff --git a/dm/host/tests/t_vi_display_front.c b/dm/host/tests/t_vi_display_front.c new file mode 100644 index 0000000000..dc6ad71ce9 --- /dev/null +++ b/dm/host/tests/t_vi_display_front.c @@ -0,0 +1,9 @@ +// The screen t_vi_display tells hle_vi.c of (its own file, to win over hle_vi.c's weak front_display_pixels): 0 x 0 for not known +int g_w, g_h; +int front_display_pixels(int *w, int *h) { if (!g_w) return 0; *w = g_w; *h = g_h; return 1; } +// what else hle_vi.c calls, which these checks do not reach: no frames, no EDR +#include +uint64_t dm_nvn_frame_count(void) { return 0; } +void front_screen_edr(float *potential, float *current) { *potential = *current = 1; } +float front_launch_edr_potential(void) { return 1; } +void mtl_present_layer(uint32_t w, uint32_t h) { (void)w; (void)h; } diff --git a/dm/tools/docs_patches.py b/dm/tools/docs_patches.py index 5dfb018390..a3ae514bbc 100644 --- a/dm/tools/docs_patches.py +++ b/dm/tools/docs_patches.py @@ -174,7 +174,7 @@ def build_rows(gs): # {build ID: [(game, display version, module)]} def frame_step_sites(fn): # (offset, reason) of each site a FRAME_STEP function writes, and whether it marks a render-scale stub pos, puts = [0x8000000], [] def emit(w): pos[0] += 4 - ctx = types.SimpleNamespace(here=lambda: pos[0], emit=emit, site=lambda off, orig: None, put=lambda off, words, why: puts.append((off, why)), state=0x9000000, render_scale=0) + ctx = types.SimpleNamespace(here=lambda: pos[0], emit=emit, site=lambda off, orig: None, put=lambda off, words, why: puts.append((off, why)), area=lambda off: None, state=0x9000000, render_scale=0) fn(ctx) return sorted(puts), ctx.render_scale diff --git a/dm/tools/patch_nso.py b/dm/tools/patch_nso.py index 0c44ae1838..d5e72c738e 100644 --- a/dm/tools/patch_nso.py +++ b/dm/tools/patch_nso.py @@ -1427,7 +1427,9 @@ def stdalloc_gates(): # +0x20 u32 step in vsyncs (host; 0 = not decided yet), +0x24 u32 a step the game fixes itself (BotW's VFR override; 0 = none), +0x28 u32 AoC's vsyncs per update, marked by # its first stub (0 = off), +0x30 u64 vsyncs stepped (the stubs; logged by the host to check the game's speed). Stub bodies assembled with clang # A build's stubs are FRAME_STEP[build ID](ctx) in its patches.py: ctx.here() / ctx.emit(word) assemble into the patch area, ctx.site(offset, original bytes) asserts a site and that it is -# no rewrite site, ctx.put(offset, words, reason) writes it (listed with the cuts), ctx.state is the state page's offset, and ctx.render_scale = 1 marks a render-scale stub +# no rewrite site, ctx.put(offset, words, reason) writes it (listed with the cuts), ctx.area(offset) switches the stubs that follow to the patch area that reaches that offset (the +# front one by default; a main of more than 128 MB of text has two, and StarFox's site lies beyond the front one's reach), ctx.state is the state page's offset, and +# ctx.render_scale = 1 marks a render-scale stub FRAME_STEP = PATCHES['FRAME_STEP'] FS_STATE_OFF = 0 RENDER_SCALE = 0 # 1 = the build has a render-scale stub (state +0x10): the fixups table says so (RENDER_SCALE), and the iOS launcher offers the setting (dm/games/settings.tsv) @@ -1448,7 +1450,7 @@ def fs_put(off, words, why): for i, w in enumerate(words): struct.pack_into(',,,,` (hex offsets in the heap object; default Mario's `0,28,30,b0,c8`, Breath of the Wild's `28,38,40,e0,f8`; find them in the heap's constructor and `tryAlloc`). `DM_PROBE_HEAPNAME=` reports only hits whose heap name contains the text (resource heaps are named after their file), `DM_PROBE_HEAPWORDS=1` adds the first two words of each used block (a vtable names the object), `DM_PROBE_HEAPFRAME=` prints heaps of that class as frame heaps (head, tail, free), and `DM_PROBE_HEAPRAW=1` dumps the heap object's first 0x130 bytes, to find another class's fields. -`DM_PROBE_ALL=1` adds x9–x18; `DM_PROBE_X2=` dumps the memory x2 points to. +`DM_PROBE_ALL=1` adds x9–x18 (`DM_PROBE_FP=1`: s0–s15); `DM_PROBE_X2=` dumps memory at x2. `DM_PROBE_FRAMES=3000-3001` restricts observations to those presented frames (a single frame is also accepted); `DM_PROBE_LIMIT=20` caps printed hits per probe. These controls bound a late-game observation without logging startup. -**Who writes a word: `DM_PROBE_WATCH=[heap+]
[+]`** (hex guest address, 8 bytes by default; the bytes must lie in one 16 KB host page). The host write-protects that page as soon as it is writable and keeps it protected: the fault handler carries out every store that lands on the page through a second, writable mapping of it (STR / STUR / STP of general and SIMD registers in their immediate, pre- and post-index forms, register-offset STR, DC ZVA), so the stores of a busy page all pass through it. A store that reaches the watched bytes prints `WATCH … store of N bytes at …: old → new`, the thread, pc, lr and a backtrace. Other instructions (atomics, exclusives) get a `not emulated` line once per pc and run on an unprotected page, protected again a millisecond later. A guest object keeps its heap offset in every run (the heap's base may move: use `heap+`), so take the address from a probe's register dump first. STEINS;GATE RE:BOOT's render size setting (engine object + 0x6000): the static search for stores with that offset, conditional probes on 25 candidate stores and a wrapper around the host's `memcpy` / `memset` (the guest's go straight to the host's libc, `hle_table.c`, where guest probes cannot see them) all found nothing; a watch that unprotected the page for every fault missed the write among the bursts of stores to the engine object's page; this one found it on the first run (`main+0x389e90`, a setter its start-up code calls with 0). +**Who writes a word: `DM_PROBE_WATCH=[heap+|as+]
[+]`** (hex guest address, 8 bytes by default; the bytes must lie in one 16 KB host page). The host write-protects that page as soon as it is writable and keeps it protected: the fault handler carries out every store that lands on the page through a second, writable mapping of it (STR / STUR / STP of general and SIMD registers in their immediate, pre- and post-index forms, register-offset STR, DC ZVA), so the stores of a busy page all pass through it. A store that reaches the watched bytes prints `WATCH … store of N bytes at …: old → new`, the thread, pc, lr and a backtrace. Other instructions (atomics, exclusives) get a `not emulated` line once per pc and run on an unprotected page, protected again a millisecond later. A guest object keeps its heap offset in every run (the heap's base may move: use `heap+`), so take the address from a probe's register dump first. STEINS;GATE RE:BOOT's render size setting (engine object + 0x6000): the static search for stores with that offset, conditional probes on 25 candidate stores and a wrapper around the host's `memcpy` / `memset` (the guest's go straight to the host's libc, `hle_table.c`, where guest probes cannot see them) all found nothing; a watch that unprotected the page for every fault missed the write among the bursts of stores to the engine object's page; this one found it on the first run (`main+0x389e90`, a setter its start-up code calls with 0). An exclusive or atomic store (`STXR`, `STLR`, `CAS`, `SWP`, `LD`) that reaches the watched bytes prints `WATCH … exclusive store` (or `atomic store`) with its pc and backtrace, every time, though it is not emulated. A page that takes many atomics stays unprotected most of the time, so even that can miss: Tears of the Kingdom's memory-shortage flag (a word its frame check compares with 1 and clears) shares its page with atomic counters, and the watch saw neither the write nor the check's own clear. diff --git a/docs/agents/game-patches.md b/docs/agents/game-patches.md index d9b9e8f53d..d3774d1aa2 100644 --- a/docs/agents/game-patches.md +++ b/docs/agents/game-patches.md @@ -55,6 +55,7 @@ Every patch bound tighter than it could be: the open gaps, then the blocked, kep | `build` → `game` | 60 fps frame step and render scale (ksys::VFR) | frame rate | blocked: frame-step stubs have no function-matched form yet | judgement | 1 | [The Legend of Zelda: Breath of the Wild](../../dm/games/01007EF00011E000/README.md) | the game's own frame code; the frame-step state page is general | | `build` → `game` | 60 fps frame step: the KIDS frame task and frame-rate block | frame rate | blocked: frame-step stubs have no function-matched form yet | judgement | 1 | [Hyrule Warriors: Age of Calamity](../../dm/games/01002B00111A2000/README.md) | the game's own frame code; only the host's frame-step state page is shared. Fire Emblem: Three Houses and Taiko Risshiden V DX run on KTGL too, with other frame code | | `build` → `game` | frame step floor 2 → 1 vsync, and its frame step | frame rate | blocked: frame-step stubs have no function-matched form yet | judgement | 1 | [Paper Mario: The Thousand-Year Door](../../dm/games/0100ECD018EBE000/README.md) | the game's own clock floor and step | +| `build` → `game` | scene resolution scale | rendering | blocked: frame-step stubs have no function-matched form yet | judgement | 1 | [Star Fox](../../dm/games/0400E88025B1A000/README.md) | the game's own settings read in its renderer | | `build` → `game` | screen shape: the sizes, the view, the layouts' projection and their edge widgets (DM_SCREEN_ASPECT) | rendering | blocked: the stubs have no function-matched form yet | judgement | 1 | [Animal Crossing: New Horizons](../../dm/games/01006F8002326000/README.md) | the output size is the host's, but where the game takes its sizes, its cameras and its layouts are this build's code | | `build` → `game` | Hagi coroutine stack region 1 GB → 64 MB | memory | kept: 1.1.4 is the last update; a match over Hagi would serve no other build of this game | checked: the final build 1.1.4 (the only one the profile packs), 2026-11-04 | 1 | [Super Mario 3D All-Stars: Super Mario Sunshine](../../dm/games/010049900F546002/README.md) | a size inside Hagi's own code: nothing the host sees tells a 1 GB reservation it can shrink from one it cannot | @@ -81,6 +82,7 @@ Every patch bound tighter than it could be: the open gaps, then the blocked, kep | [Paper Mario: The Thousand-Year Door](#paper-mario-the-thousand-year-door) | 1 | 0 | 1 | 0 | 0 | `build` → `game` | | [Pokémon Brilliant Diamond](#pokémon-brilliant-diamond) | 0 | 0 | 0 | 0 | 1 | `build` → `engine` | | [Pokémon Legends: Arceus](#pokémon-legends-arceus) | 0 | 0 | 0 | 1 | 0 | `game` | +| [Star Fox](#star-fox) | 0 | 0 | 1 | 0 | 0 | `build` → `game` | | [Subnautica](#subnautica) | 1 | 0 | 0 | 0 | 0 | `build` → `game` | | [Subnautica: Below Zero](#subnautica-below-zero) | 1 | 0 | 0 | 0 | 0 | `build` → `game` | | [Super Mario 3D All-Stars: Super Mario Sunshine](#super-mario-3d-all-stars-super-mario-sunshine) | 2 | 0 | 0 | 0 | 0 | `build` → `game` | @@ -456,6 +458,16 @@ Every patch bound tighter than it could be: the open gaps, then the blocked, kep - **function-matched** (`main` of builds without CUTS): capture demo: the empty result when the weak reference at +0x88 is unset or dead: 1 function, 5 cuts +### Star Fox + +[Star Fox](../../dm/games/0400E88025B1A000/README.md), `0400E88025B1A000`, [patches.py](../../dm/games/0400E88025B1A000/patches.py). + +- **`build` → `game`**, rendering, blocked: frame-step stubs have no function-matched form yet, judgement: scene resolution scale. The game's own settings read in its renderer + +- **v131072 `main`** `a7730d0f…` ([patches.py:25](../../dm/games/0400E88025B1A000/patches.py#L25)) + - frame step `+0xb4498ac`: scene resolution scale from the host (DM_RESOLUTION_SCALE; 0 = the game's own) + - launcher capabilities: RESOLUTION_SCALE + ### Subnautica [Subnautica](../../dm/games/0100429011144000/README.md), `0100429011144000`, [patches.py](../../dm/games/0100429011144000/patches.py). diff --git a/docs/agents/symptoms.md b/docs/agents/symptoms.md index b96a5fa1be..ed136f6e6f 100644 --- a/docs/agents/symptoms.md +++ b/docs/agents/symptoms.md @@ -256,6 +256,7 @@ One line per symptom in the [subsystem references](../reference/): what you see - SIGSEGV in `vi::GetDefaultDisplayPanelIdentifier` (`main+0xa9a4`, before the window). → [Default display panel identifier](../reference/services.md#default-display-panel-identifier) - the first boot crashed in `oe::DisableAlbumImageTakenNotification`: a null read at `sdk+0x338070`, the first call in `nnMain` (`main+0x6b188c`); enabling those notifications also gives a null read at `sdk+0x33b0f0` (Xenoblade Chronicles 3); other `oe` calls that reach am, found in the imports before they were met. → [oe calls answered without an applet proxy](../reference/services.md#oe-calls-answered-without-an-applet-proxy) - a null read at `sdk+0x36ec60` in `oe::EnableAlbumImageTakenNotification`, called from `nnMain` (`main+0x286268`). → [oe calls answered without an applet proxy](../reference/services.md#oe-calls-answered-without-an-applet-proxy) +- a Switch 2 game renders smaller docked than handheld, or smaller than console footage: Star Fox's scene was 768x432 docked (DLSS network resized to it at boot, its window 1920x1080) and 960x540 handheld. Donkey Kong Bananza reads the same tier. → [The graphics scale is the GPU share, not the operation mode](../reference/services.md#the-graphics-scale-is-the-gpu-share-not-the-operation-mode) - abort in `nn::sm::Initialize` under `nn::oe::FinishStartupLogo`, right after the first frames. → [The startup logo](../reference/services.md#the-startup-logo) - null read in `oe::InitializeCopyrightFrameBuffer`, right after the window setup. → [Copyright frame buffer overlay](../reference/services.md#copyright-frame-buffer-overlay) - SDK 20 calls that reach a service, each one boot; SDK 20's `OpenAudioRenderer` aborts on an ARUID of 0. → [Applet resource user ID, launch parameters and VR mode](../reference/services.md#applet-resource-user-id-launch-parameters-and-vr-mode) @@ -314,6 +315,7 @@ One line per symptom in the [subsystem references](../reference/): what you see - a null read at boot in `nn::oe::IsLanguageSelectionLimited`, right after the game asks for its language. → [Whether the language selection is limited](../reference/services.md#whether-the-language-selection-is-limited) - a null read at boot in `nn::os::SdkMutexType` under `nn::gs::sdk::SetGraphicsFrameLengthMode`, called from `nn::oe::SetGraphicsTargetFrameRate`. → [The target frame rate (graphics frame length)](../reference/services.md#the-target-frame-rate-graphics-frame-length) - a Switch 2 game presents at 720p, with its upscaler at the matching low size. → [The display's largest buffer](../reference/services.md#the-displays-largest-buffer) +- a Switch 2 game outputs 1920x1080 docked on a 4K screen, its scene a quarter of that, softer than console footage from a 4K TV: Star Fox rendered 960x540 for a 1080p window that the present stretched to the screen. → [The display's largest layer](../reference/services.md#the-displays-largest-layer) - `registered NROs not found` from `nro_collect.py` in a game whose RomFS has an NRR, or `[RED] ro::LoadModule: no rewritten NRO with SHA-256 …`. `main` is small (about 600 KB of code) beside a data segment of random-looking bytes. → [A game that decodes its code at run time](../reference/services.md#a-game-that-decodes-its-code-at-run-time) - a crash in `ro::RegisterModuleInfo`, or an NRR that seems to register millions of hashes: the words at +0x340 and +0x344 are random. → [NRR version 1](../reference/services.md#nrr-version-1) @@ -512,6 +514,7 @@ One line per symptom in the [subsystem references](../reference/): what you see - a texture the game builds from CPU-filled textures read back with `nvnTextureReadTexels` comes out zero. → [`ReadTexels` from guest memory and textures written after first use](../reference/nvn-objects.md#readtexels-from-guest-memory-and-textures-written-after-first-use) - `[RED] upload batches belong to the submit thread only: up_begin called on thread '…'`, then an abort, with `pkg_upload` ← `tex_mtl` ← `mtl_read_texels` on the stack; or `CRASH sig=10` in `nvn_deswizzle` ← `mtl_read_texels`, at an address in a sparse virtual pool's reserved range. → [`ReadTexels` on a texture of a sparse pool](../reference/nvn-objects.md#readtexels-on-a-texture-of-a-sparse-pool) - a streamed texture's small mip levels hold another texture or zeros while its large levels are right (`texraw .`), so surfaces sampled with a mip bias or at a distance show bright speckles, dark blotches and sharp detail where the Switch shows soft texture (Yoshi's felt), from the moment finer levels stream in (the opening going dark). → [GPU copies into textures uploaded from their storage](../reference/nvn-objects.md#gpu-copies-into-textures-uploaded-from-their-storage) +- while a scene streams in, frames of seconds whose `[longframe]` line has hundreds of re-uploads and gigabytes (`texture uploads 98 first + 280 re-uploads, 12287.6 MB / 8091.3 ms`); picture, sound and controller drift behind. With `DM_NVN_REUPLOADS=1` each re-upload follows one GPU copy into the texture, which wrote a few of its thousands of pages. → [A GPU copy into a texture uploaded from its storage uploaded all of it again](../reference/nvn-objects.md#a-gpu-copy-into-a-texture-uploaded-from-its-storage-uploaded-all-of-it-again) - what the GPU drew into a texture is lost later: a texture re-created from the same memory, or one the game moved with `memcpy`, comes out zero; on the Switch it holds the drawing. Tears of the Kingdom: the grass of a meadow is drawn with no length and the ground under it goes dark, a few seconds after loading, tile by tile around Link. → [Render passes into textures uploaded from their storage](../reference/nvn-objects.md#render-passes-into-textures-uploaded-from-their-storage) - the `[nvn] residency set up to frame …` line shows hundreds of additions from `mirror_readback`'s line in `nvn_mtl.m` every 300 frames, and as many removals, with the residency commits' time up. Tears of the Kingdom: about 1,500 every 300 frames on an iPhone 17 (1.4.2, seedds/nxnative#931), about 370 on a Mac. → [Readback buffers kept for reuse](../reference/nvn-objects.md#readback-buffers-kept-for-reuse) - textures that should hold CPU-written data come out magenta (ASTC's error colour) or black. → [Sampled textures in a sparse pool uploaded through the page table](../reference/nvn-objects.md#sampled-textures-in-a-sparse-pool-uploaded-through-the-page-table) @@ -560,6 +563,7 @@ One line per symptom in the [subsystem references](../reference/): what you see - `[RED] texture type mismatch: shader … declares slot … as Metal type 2, texture ID … is type 4 (NVN target 5, …); bound as is`, for a shader whose MSL declares the slot `texture2d_ms`. → [Multisample texture slots](../reference/rendering.md#multisample-texture-slots) - translucent UI (frosted text bands, button guides, dialog headers) yellow and white. → [Integer views for images a shader declares uint or int](../reference/rendering.md#integer-views-for-images-a-shader-declares-uint-or-int) - flat-coloured objects with no texture detail in an otherwise correct scene: the UVs and colours a vertex factory fetches from buffers read 0. Then `texture buffers bound as 2D rows … N times, about N made` in the log, a Metal texture for nearly every bind. → [Buffer textures behind handles in uniform buffers, and rows of finalized descriptors](../reference/rendering.md#buffer-textures-behind-handles-in-uniform-buffers-and-rows-of-finalized-descriptors) +- the whole picture pale and washed out, its blacks lifted to grey (a frame's median luminance 0.46 against 0.16 in console footage, its darkest percent 0.18 against 0.01): bloom reads as a haze over everything and the dither of fine detail (Star Fox's fur) as grain. A pass dump shows a compute shader writing an `RGBA8_SRGB` texture (Metal format 71) through an image. → [sRGB textures loaded and stored raw through an image](../reference/rendering.md#srgb-textures-loaded-and-stored-raw-through-an-image) - `texture type mismatch: shader declares 2, texture is 9`; the slot read 0. → [Buffer textures read by 1D integer fetches (row wrap)](../reference/rendering.md#buffer-textures-read-by-1d-integer-fetches-row-wrap) - none of its own seen here. Pull request #984 reports GPU hangs from huge light counts on its build of the same game. → [Integer buffer textures read through float slots](../reference/rendering.md#integer-buffer-textures-read-through-float-slots) - none visible on an M6, where at most 0.23 % of pixels differ between paired runs. GitHub issue #783 reports wrong light offsets on an M2. → [Integer textures read through float slots](../reference/rendering.md#integer-textures-read-through-float-slots) diff --git a/docs/env_switches.tsv b/docs/env_switches.tsv index 5c0f154cb4..788186627a 100644 --- a/docs/env_switches.tsv +++ b/docs/env_switches.tsv @@ -52,6 +52,7 @@ DM_GAMES_DIR path Profile folders outside the repository, separated by `:`, sear DM_GAMES_FIRST switch `=1` searches `DM_GAMES_DIR` before `dm/games`, so a provisional or derived profile wins over the game's own (the NSP script's `--provisional`) DM_GAME_ENV switch `KEY=VALUE` pairs, separated by spaces, that the game's own `getenv` returns, in place of the profile's `game_env` (`hle_os.c`); any other name goes to the SDK's empty environment DM_GFX_FIXTURE_OUT test `=`: graphics tests write their raw result textures and buffers there +DM_GFX_SCALE diagnostic The graphics scale tier `oe::GetCurrentGraphicsScale` answers: `0` the whole GPU (default), `1` or `2` the smaller shares the system leaves a game while it uses the GPU itself (GameChat video) DM_GLSLC_CAPTURE path `=` saves every GLSLC output the game compiles at run time; `shader_split.py` reads it (default `/glslc_capture`) DM_GL_CAPTURE path `=`: the GL layer writes every shader source the game compiles (`.vert` / `.frag`) for `gl_shaders.py`; the NSP script uses it to capture run-time shaders DM_GL_DRAWLOG diagnostic `=[:]` logs the first `` GL draws after ``, each with its framebuffer, viewport, scissor box, program, uniforms, samplers and its vertex attributes' first vertices; `=1` or more also names samplers that have no texture @@ -120,6 +121,7 @@ DM_NVN_CBDUMP_KEY diagnostic `=`: limits `DM_NVN_CBDUMP` to draws us DM_NVN_CBLOG diagnostic `=1` logs the command memory the game adds to command buffers (`AddCommandMemory`: the first 60, then every 500th) and the out-of-memory callbacks DM_NVN_CLEARLOG diagnostic `=1` logs the first 40 colour clears drawn as a triangle (inside a pass, with a partial channel mask or a partial scissor) DM_NVN_CMDSTAT diagnostic `=1` logs every 300 frames the command recording usage: bytes and records per frame, command memory segment sizes, out-of-memory callbacks, host segments, count and bytes per command type +DM_NVN_COPY_ABSORB switch `0` uploads a texture taken from its storage again after each GPU copy into it whose bytes the host also wrote into the storage (on by default the copy is absorbed: `pkg_copy_absorb`), to measure it DM_NVN_COUNT diagnostic `1` counts every NVN call (the counting trampolines) and writes the per-frame call lines; off by default (on with a `DM_NVN_TSV` table that has call rows), the count is an atomic add all recording threads share DM_NVN_CPUPROF diagnostic 1 records CPU wall/time/instruction totals by renderer operation; off by default. DM_NVN_CSH_PRESCAN diagnostic `0` runs the compute-hoist scan at every pass's first draw even when no dispatch follows (as before; for timing) @@ -171,6 +173,7 @@ DM_NVN_PREFETCH switch `0` turns off loading a program's shader libraries in the DM_NVN_PROF diagnostic `=1` wraps the implemented NVN functions in a timing wrapper and collects the time each takes during recording DM_NVN_PROGTRACE diagnostic `=` logs matching ProgramSetShaders calls and their guest backtraces DM_NVN_REGLUM diagnostic `=x0,y0,x1,y1:` (normalized coordinates): on every present records the present number, time, mean luminance and a grayscale thumbnail of that region, to check animation speed against frame rate +DM_NVN_REUPLOADS diagnostic `=1` logs the first 400 re-uploads of textures taken from their storage: shape, size, the pages written since the upload and where the first lies, and the GPU copies into it since then DM_NVN_RP_AREA switch `0` makes passes on targets of 16 M pixels or more cover the whole target, as before; by default a draw pass that loads what it keeps stops at the far corner of its scissor when that is at most half the target DM_NVN_RT_CONTINUE switch `0` ends the pass whenever the game sets render targets, as before; by default SetRenderTargets naming the open pass's targets continues the pass DM_NVN_RT_RANGE switch `=1` (experimental, off by default; with `DM_NVN_TBDR=1`) keeps the pass open when the game sets the same colour and depth target again with a view that differs only in its level count @@ -244,6 +247,7 @@ DM_PREV_PROGRAM switch What `oe::GetPreviousProgramIndex` answers (default -1, s DM_PROBE diagnostic `=module:offset,…` (Mac only): puts a `brk` at each guest address and on every hit prints the thread, registers, strings they point to and a backtrace, then runs the original instruction DM_PROBE_ALL diagnostic Set: probe hits (`DM_PROBE`) also print x8–x18 DM_PROBE_DUMP diagnostic `=module:offset:length[:file]`: on the first hit of any probe, writes that range of guest memory to a file (default `run//probe_dump.bin`) +DM_PROBE_FP diagnostic Set: probe hits (`DM_PROBE`) also print s0–s15, the low 32 bits of v0–v15 as floats DM_PROBE_FRAMES diagnostic Presented frame or inclusive `start-end` range in which guest probes print observations DM_PROBE_HEAP diagnostic `=,,,,`: hex offsets of the sead heap layout the probes' `!xN` heap walk uses (default Mario's `0,28,30,b0,c8`) DM_PROBE_HEAPFRAME diagnostic `=` (hex): the probes' heap walk treats heaps of that class as frame heaps (head +0xe0, tail +0xe8) @@ -279,6 +283,7 @@ DM_QOS_MAP switch `=1` maps guest thread priority to QoS class: ≤ 44 user-inte DM_REC diagnostic `=`: writes player 1's physical input (keyboard, mouse touches, controllers; never `DM_KEYS` / `DM_CTL`) to the file as `DM_KEYS` steps in presented frames, for replaying a run (`DM_KEYS=@`) DM_REGIONS diagnostic `=` writes the table of the SDK's address regions every 2 s (alias offset, size, where the request returns to in the game, bytes mapped, the part opened, the SDK offset the request came through; `hle_svc.c` "Address regions"); the NSP script's address region check sets it DM_RENDER_SCALE player `0.5` to `1.0`: fixes the game's 3D views at that fraction of their size and turns its dynamic resolution off, for builds with a render scale stub; `1.0` (the default) keeps it +DM_RESOLUTION_SCALE player `0.25` to `1.0`: the share of the target Star Fox renders its scene at, in place of its settings' scale (0.5 docked, 0.83 handheld); `0` or unset keeps the game's own; only on the builds whose patches.py names the RESOLUTION_SCALE capability. The launcher's Resolution DM_RESOURCE_AOC path The add-on content folder the iOS build copies into the app's `aoc/` (empty for none); written by `gen_resources.py`, read by `stage_resources.sh` DM_RESOURCE_BUILD switch Package version (for example `v327680`), written to `Gen/resources.env` by `gen_resources.py`; with `DM_COPY_ROMFS=NO` the copy phase puts it in the `build=` field of the app's `romfs.id` DM_RESOURCE_CHAIN_H path Path of `dm/gfx/nvn/dmsh_chain.h`, written to `Gen/resources.env` by `build_ipa.sh`; the Xcode copy phase (`stage_resources.sh`) stops when the prepared shaders are not of its chain version diff --git a/docs/reference/memory.md b/docs/reference/memory.md index f8bebe4603..80e0e35515 100644 --- a/docs/reference/memory.md +++ b/docs/reference/memory.md @@ -447,4 +447,4 @@ The guest address space, heaps, pools, virtual address memory and the allocators - **Symptom:** on an iPhone the app is ended by the system (a jetsam event: no crash report, no `[dm] CRASH` line) once its footprint reaches the limit: about 6 GB on a 12 GB iPhone with the increased memory limit (6,143 MiB measured in LiveContainer), 3.3 GB without it. The log stops mid-frame. - **Cause:** every guest page the game has touched is anonymous memory: `phys_footprint` charges it, and iOS cannot write it out as a Mac swaps it. What the game gives back is charged again as soon as it maps the range anew. - **Fix:** the guest block in sparse files, unlinked at once, mapped shared over the reservation at the same addresses (`hle_svc.c`; `DM_GUEST_FILE_DIR`, which the iOS app sets to `NSTemporaryDirectory()`). File pages take the same memory while they stay in it, but they are out of the footprint and the kernel writes them out when it needs the room. The cost is disk (Mario Kart World on a 16 GB Mac: 5.6 GB on disk and 8-10 GB of logical writes in 5.5 minutes), so a game that fits stays anonymous: on iOS the files are on when the game's memory pool is larger than `os_proc_available_memory()` at start, and the log's `[mem] guest memory` line gives both; on the Mac only with `DM_GUEST_FILE=1`, and `0` keeps them off anywhere. A game whose memory is mostly outside the block is not helped: Unreal's heap is a host malloc zone ([Thread stacks from the host's Unreal heap](#thread-stacks-from-the-hosts-unreal-heap)). The files are 1 GB each (`DM_GUEST_FILE_CHUNK`), since the stall at the system's periodic flush, about every 30 s, grows with the file (on a 16 GB M5 Mac, with 1 GB touched, up to 148 ms with one 20 GB file, 4 ms with 20 files of 1 GB). `guest_release` only makes a range the game gives back `PROT_NONE` there, since a fresh anonymous mapping would bring it back into the footprint; its pages keep their bytes, so `alias_initialize` and `SetHeapSize` zero them when they are opened again, leaving the 4 KB pages that already read 0. `DM_GUEST_FILE_MIN_FREE` (default 5 GB) stops the game (exit code 87) before the disk fills; under it at start the guest stays anonymous, and on the Mac, which can swap, under that plus 8 GB. `make -C dm/host/tests memory-file` runs the memory SVC tests with the guest in files. -- **Found on:** [Mario Kart World](../../dm/games/0400C3F00006E000/README.md) 1.0.0 in handheld mode, on the switch2ios fork (a 12 GB iPhone, iOS 27.3, LiveContainer's 6,143 MiB limit; host from nxnative `8c0b8083` with that fork's changes): ended at 90 s with the guest anonymous; with one file, 7 min 33 s played, peak 5.56 GiB; with 1 GB files (and a larger texture view cache), a 14-minute session held, peak 5,663 MB, no 30-s stall left. On a 16 GB Mac the peak footprint fell from 11.6 GiB to 5.6. On this host (`975bb4c1` with this switch, 1 GB files, a larger texture view cache and the profile's map limit), a 16 GB M5 Mac with the iPhone's settings peaked at 4,365 and 4,792 MiB over an 18- and a 30-minute session, and the same build plays on the 12 GB iPhone. On iPhones with an 8 GiB limit ([#1184](https://github.com/seedds/nxnative/issues/1184)), where the game was ended at course load, or 30 s in at 8.1 GB, the fork's version of this switch merged by hand let it finish races: 4.41 GB at most over 13 minutes and two races on an iPhone 18 Pro with 512 MB files. Those phone runs also had a larger texture view cache (`DM_NVN_VC_WAYS=64`), which is not on main. +- **Found on:** [Mario Kart World](../../dm/games/0400C3F00006E000/README.md) 1.0.0 in handheld mode, on the switch2ios fork (a 12 GB iPhone, iOS 27.3, LiveContainer's 6,143 MiB limit; host from nxnative `8c0b8083` with that fork's changes): ended at 90 s with the guest anonymous; with one file, 7 min 33 s played, peak 5.56 GiB; with 1 GB files (and a larger texture view cache), a 14-minute session held, peak 5,663 MB, no 30-s stall left. On a 16 GB Mac the peak footprint fell from 11.6 GiB to 5.6. On this host (`975bb4c1` with this switch, 1 GB files, a larger texture view cache and the profile's map limit), a 16 GB M5 Mac with the iPhone's settings peaked at 4,365 and 4,792 MiB over an 18- and a 30-minute session, and the same build plays on the 12 GB iPhone. On iPhones with an 8 GiB limit ([#1184](https://github.com/seedds/nxnative/issues/1184)), where the game was ended at course load, or 30 s in at 8.1 GB, the fork's version of this switch merged by hand let it finish races: 4.41 GB at most over 13 minutes and two races on an iPhone 18 Pro with 512 MB files. Those phone runs also had a larger texture view cache (the fork's DM_NVN_VC_WAYS=64), which is not on main. diff --git a/docs/reference/nvn-objects.md b/docs/reference/nvn-objects.md index db96a0e780..4db6df9774 100644 --- a/docs/reference/nvn-objects.md +++ b/docs/reference/nvn-objects.md @@ -485,10 +485,19 @@ Games read this count as a position in their own command memory and size their h - **Symptom:** a streamed texture's small mip levels hold another texture or zeros while its large levels are right (`texraw .`), so surfaces sampled with a mip bias or at a distance show bright speckles, dark blotches and sharp detail where the Switch shows soft texture (Yoshi's felt), from the moment finer levels stream in (the opening going dark). - **Cause:** the game fills a texture partly from the CPU and partly with GPU copies. Unreal's streamer re-creates a texture with more levels, copies the resident levels from the old texture on the GPU (`RHIAsyncReallocateTexture2D`: `nvnCommandBufferCopyTextureToTexture`, a level at a time) and writes the new, finer levels from the CPU. The host uploads a CPU-written texture whole from its storage, where the copied levels were never written: they held what the pool had there before. -- **Fix:** a copy into a texture whose storage the host uploads from (a packaged layout, CPU-written, or registered by `tex_flush_upload` / `tex_dirty_upload` and not resolved yet) is written into the storage as well, as the hardware's copy would (`nvn_tex_mirror_t2t` / `nvn_tex_mirror_b2t` in `hle_nvn.c`, from `copy_t2t` / `copy_b2t` in `nvn_mtl.m`), when its source is a buffer or a texture whose storage holds its content; the write marks the pages, so the next upload carries the levels. When the source is the GPU's (a texture whose host texture, or the one its packaged record holds, can be rendered into or written by shaders, `tex_gpu_touched`; a buffer a copy, fill or update queued in the submission, a shader or a copy of a submission still running wrote, `pend_hits` / `sbw_hits` / `gw_live`), when a readback into the source or the destination is still pending (`mrb_pending`: the storage lacks those bytes until it lands, and the later copy must land after it), or when the CPU mirror cannot do the copy (a format change, a scaled or flipped copy drawn by `copy_t2t_draw`), the destination region is read back after the copy on the GPU into a shared buffer and written into the storage in the submission's completion handler, before its fence is published (`mirror_readback` / `mirror_rb_land`, a kind 4 post-op). Depth and stencil formats, multisample textures and 3D destinations are left out and reported red. +- **Fix:** a copy into a texture whose storage the host uploads from (a packaged layout, CPU-written, or registered by `tex_flush_upload` / `tex_dirty_upload` and not resolved yet) is written into the storage as well, as the hardware's copy would (`nvn_tex_mirror_t2t` / `nvn_tex_mirror_b2t` in `hle_nvn.c`, from `copy_t2t` / `copy_b2t` in `nvn_mtl.m`), when its source is a buffer or a texture whose storage holds its content; the storage then holds the levels for any later upload, while the copy itself uploads nothing ([next entry](#a-gpu-copy-into-a-texture-uploaded-from-its-storage-uploaded-all-of-it-again)). When the source is the GPU's (a texture whose host texture, or the one its packaged record holds, can be rendered into or written by shaders, `tex_gpu_touched`; a buffer a copy, fill or update queued in the submission, a shader or a copy of a submission still running wrote, `pend_hits` / `sbw_hits` / `gw_live`), when a readback into the source or the destination is still pending (`mrb_pending`: the storage lacks those bytes until it lands, and the later copy must land after it), or when the CPU mirror cannot do the copy (a format change, a scaled or flipped copy drawn by `copy_t2t_draw`), the destination region is read back after the copy on the GPU into a shared buffer and written into the storage in the submission's completion handler, before its fence is published (`mirror_readback` / `mirror_rb_land`, a kind 4 post-op). Depth and stencil formats, multisample textures and 3D destinations are left out and reported red. - **Check:** `t_nvn` 6c3 checks region and whole-level copies between textures of different block heights (RGBA8, BC1) and from a strided buffer, byte for byte against a level round trip; `t_readback` copies a cleared render target into a packaged texture and reads the clear colour back from its storage. In the log, `texture→texture copy into ser=… written into the storage as well` or `… read back into the storage when the GPU completes`. - **Found on:** [Yoshi's Crafted World](../../dm/games/01006000040C2000/README.md): the Yoshis' 1024² DXT1 base colour and BC5 normal textures, 11 levels; level 4 of one held a pink felt texture, of the others zeros; the speckles began when the opening went dark. +### A GPU copy into a texture uploaded from its storage uploaded all of it again + +- **Symptom:** while a scene streams in, frames of seconds whose `[longframe]` line has hundreds of re-uploads and gigabytes (`texture uploads 98 first + 280 re-uploads, 12287.6 MB / 8091.3 ms`); picture, sound and controller drift behind. With `DM_NVN_REUPLOADS=1` each re-upload follows one GPU copy into the texture, which wrote a few of its thousands of pages. +- **Cause:** a GPU copy into such a texture is written into its storage as well ([previous entry](#gpu-copies-into-textures-uploaded-from-their-storage)), and that write marked the pages as a CPU write does. At the texture's next use, the next copy's own lookup of its destination, the host uploaded all of it from the storage again, though the copy, encoded on the GPU, had already written the same bytes into the host texture: one whole-texture upload per copy for a game that fills a large texture a level at a time. +- **Fix:** once the copy is encoded (`copy_b2t` / `copy_t2t`), `pkg_copy_absorb` (`nvn_mtl.m`) stamps and protects the storage again, and the texture keeps its host texture when no page wholly inside it was written since its upload but those of the copied levels (`nvn_dirty_since_except` in `nvn_dirty.c`) and its own bytes in its edge pages, outside the copied levels, are as kept ([as for writes beside it](#writes-beside-a-packaged-texture-in-a-shared-host-page)). Any other write still uploads it at its next use. Counted in the `packaged textures` line as `GPU copies into one written into its storage too (not re-uploaded)`; `DM_NVN_COPY_ABSORB=0` turns it off, to measure it. For every game. +- **Open:** a CPU write into the copied levels' pages between the copy's lookup of the texture and the protection is not told from the copy's own: the storage holds it, the host texture gets it at the next write there (on the hardware the copy writes those bytes at that moment too). A copy read back into the storage when the GPU completes (a source the GPU wrote, `mirror_readback`) still uploads the texture again after it lands. +- **Check:** `t_readback` (`copy_stream`): nine buffer-to-texture copies into a 64x64x4 RGBA8 packaged array, a level of a layer each, after a CPU write into another layer, upload it once (the CPU write) instead of 10 times, and the host texture (read back on the GPU) and the storage hold every byte as copied; a CPU write after the copies, one beside a copy's level before it is absorbed, and one into the texture's bytes in its shared first page are each uploaded, a neighbour's write in that page is not. `t_dirty_slots` covers `nvn_dirty_since_except`. +- **Found on:** [Star Fox](../../dm/games/0400E88025B1A000/README.md) (measured on a build of our fork, not `main`): its streamer fills BC7 2D arrays (512x512x128 with 10 levels, 43 MB; 1024x1024x64 with 6, 85 MB) with `nvnCommandBufferCopyBufferToTexture`, a level of a layer per copy, at each scene change of the prologue (`prologue_part2_stage` … `part5_stage`). Headless on an M5 Pro, 240 s of the same route with the switch off and on: 986 re-uploads before (each of the 400 logged followed one copy that had written 1-17 of the array's 2,752 16 KB pages), three frames of 280 re-uploads (12.0-12.3 GB, 2.1-7.6 s); none after (986 copies absorbed). Frames over 1 s went from 5 to 1, the worst from 7.6 s to 1.6 s; what is left is first uploads (117 new textures, 400 MB). The player's log had a 10.0 s frame (280 re-uploads, 12.3 GB). + ### Render passes into textures uploaded from their storage - **Symptom:** what the GPU drew into a texture is lost later: a texture re-created from the same memory, or one the game moved with `memcpy`, comes out zero; on the Switch it holds the drawing. Tears of the Kingdom: the grass of a meadow is drawn with no length and the ground under it goes dark, a few seconds after loading, tile by tile around Link. diff --git a/docs/reference/rendering.md b/docs/reference/rendering.md index 45348ced47..81f9fded3a 100644 --- a/docs/reference/rendering.md +++ b/docs/reference/rendering.md @@ -154,6 +154,14 @@ The replay on Metal (`dm/gfx/nvn/nvn_mtl.m`) and the Vulkan and OpenGL layers. E - **Fix:** any `NVN_RB_TEXU` declared 2D takes the row form for a buffer texture. Rows of a finalized object are kept by what they view (`g_tb2_gone`: buffer, offset, length, format), emptied with the pools. - **Found on:** [Yoshi and the Mysterious Book](../../dm/games/0400245021D2C000/README.md): 13.1 million views made for 13.2 million binds became 1.08 million, with frame times unchanged at 16.7 ms. +### sRGB textures loaded and stored raw through an image + +- **Symptom:** the whole picture pale and washed out, its blacks lifted to grey (a frame's median luminance 0.46 against 0.16 in console footage, its darkest percent 0.18 against 0.01): bloom reads as a haze over everything and the dither of fine detail (Star Fox's fur) as grain. A pass dump shows a compute shader writing an `RGBA8_SRGB` texture (Metal format 71) through an image. +- **Cause:** NVN's image loads and stores convert no sRGB, as OpenGL's image units do not (no sRGB format is an image format there), so a shader that stores an sRGB-encoded value into an sRGB texture's image leaves those bytes as they are; sampling decodes them later. Metal decodes a read and encodes a write through an sRGB format, and the host bound the texture's own Metal format to the image slot, so each stored value was encoded a second time. Star Fox relies on it: after DLSS (MetalFX here) its copy pass encodes the linear result itself (`35ebccc529cc58a9`, flag 0x80) into its `RGBA8_SRGB` target, so that the upscaler network (`ddc729bcdb4c8df9`), which samples that target, gets encoded colour, and the network stores its encoded output into the `RGBA8_SRGB` image it fills (768x432 → 1536x864). Measured on one frame: MetalFX's output equals the decoded input (identity), the stored bytes are the twice-encoded output, and the displayed picture decoded once matches the console footage's percentiles within 0.02. +- **Fix:** `img_binding` / `img_fit` (`nvn_mtl.m`), for every game: an image slot holding an sRGB texture gets a view of its linear twin (`pf_srgb_linear`, the `g_pfv_srgb` pairs, which Metal views without the format-view usage), so loads and stores go raw; the sampled descriptor keeps the sRGB format. Log line `sRGB texture bound as an image`. The MetalFX stand-in for a game's upscaler ([A game's own upscaler drawn by MetalFX](#a-games-own-upscaler-drawn-by-metalfx)) takes its output through the same binding; no game seen gives it an sRGB image (Donkey Kong Bananza's is R11G11B10F). +- **Check:** `make -C dm/gfx/tests GAME= check_t_image_srgb` (Metal validation): RGBA8_SRGB and BGRA8_SRGB textures; the image view is the linear twin over the same writable storage, an image load returns the stored byte (0x80 → 0.502), a sampled read decodes it (0.216), and an image store of 0.5 keeps 0x80 (0xbc before). +- **Found on:** [Star Fox](../../dm/games/0400E88025B1A000/README.md) (update 131072), measured on a build of our fork: every frame after its DLSS pass; with it fixed, General Pepper's close-up in the intro matches console footage (luminance percentiles 1 / 50 / 90 / 99: 0.024 / 0.174 / 0.529 / 0.851 against 0.012 / 0.158 / 0.513 / 0.861), where before it was 0.175 / 0.456 / 0.747 / 0.933. Its bloom chain (separate textures 384x216 to 12x6, additive upsampling as the game sets it, 1/30 in the composite) and MetalFX's DLSS stand-in were measured unchanged by this. + ### Buffer textures read by 1D integer fetches (row wrap) - **Symptom:** `texture type mismatch: shader declares 2, texture is 9`; the slot read 0. diff --git a/docs/reference/services.md b/docs/reference/services.md index a01b94c868..c29fbc4a71 100644 --- a/docs/reference/services.md +++ b/docs/reference/services.md @@ -581,6 +581,13 @@ Most service calls can be found before they crash, before the first boot or the - **Fix:** hooked (`hle_oe.c`): `oe::DisableAlbumImageTakenNotification`; `oe::IsInStoreDemoModeEnabled` (no); `oe::GetDefaultDisplayResolution` and its change event; `oe::SendServerMaintenanceOverlayNotification`; `oe::SetUserInactivityDetectionTimeExtendedUnsafe`; `oe::GetPerformanceConfiguration`; `oe::SetAlbumImageOrientation`; `oe::Begin` / `EndAutoSleepDisabledSection` and `IsAutoSleepDisabled` (counted); `oe::ExecuteProgram` (logged red: the host runs one program). The ones with a symptom of their own follow: [The startup logo](#the-startup-logo), [Copyright frame buffer overlay](#copyright-frame-buffer-overlay), [Applet resource user ID, launch parameters and VR mode](#applet-resource-user-id-launch-parameters-and-vr-mode), [CPU overclock calls without an apm session](#cpu-overclock-calls-without-an-apm-session), [Focus handling mode decides whether focus changes are notified](#focus-handling-mode-decides-whether-focus-changes-are-notified). - **Found on:** [Monster Hunter Rise](../../dm/games/0100B04011742000/README.md) (SDK 11: `GetDefaultDisplayResolution`, `SendServerMaintenanceOverlayNotification`); [13 Sentinels: Aegis Rim](../../dm/games/01003FC01670C000/README.md) (SDK 11: `SetUserInactivityDetectionTimeExtendedUnsafe`); [Super Mario 3D World + Bowser's Fury](../../dm/games/010028600EBDA000/README.md) (SDK 10: `GetPerformanceConfiguration`, `SetAlbumImageOrientation`); [DRAGON QUEST XI S](../../dm/games/01006C300E9F0000/README.md) (SDK 7.3.2: the auto-sleep calls); [Octopath Traveler 0](../../dm/games/01005270232F2000/README.md) (`oe::ExecuteProgram`); [The Great Ace Attorney Chronicles](../../dm/games/010036E00FB20000/README.md) (SDK 10.4.1, Capcom's MT Framework: `DisableAlbumImageTakenNotification`, then `IsInStoreDemoModeEnabled` from the import list); [Donkey Kong Country: Tropical Freeze](../../dm/games/0100C1F0051B6000/README.md) (SDK 4.4.0: `GetUserInactivityDetectionTimeExtensionMode`, a null read at `sdk+0x15b73c` when the first level's cinematic camera starts, `CScreenDimmingUtil::DisableScreenDimming`). After all of its fixes The Great Ace Attorney Chronicles runs its frame loop at 30 fps; the black screen it showed was its textures, never uploaded (CPU-written textures, the profile's `tex_flush_upload` and `tex_dirty_upload`: [Mapped-range flushes taken as uploads (`tex_flush_upload`)](nvn-objects.md#mapped-range-flushes-taken-as-uploads-tex_flush_upload), [CPU writes with no flush, caught by page protection (`tex_dirty_upload`)](nvn-objects.md#cpu-writes-with-no-flush-caught-by-page-protection-tex_dirty_upload)). +### The graphics scale is the GPU share, not the operation mode + +- **Symptom:** a Switch 2 game renders smaller docked than handheld, or smaller than console footage: Star Fox's scene was 768x432 docked (DLSS network resized to it at boot, its window 1920x1080) and 960x540 handheld. Donkey Kong Bananza reads the same tier. +- **Cause:** `oe::GetCurrentGraphicsScale` (am's graphics scaling parameters: 10 / 20 / 30 → tier 0 / 1 / 2) is the share of the GPU the system leaves the game, which it lowers while it needs the GPU itself (GameChat's video), not the operation mode. The host answered tier 1 docked. Games size their picture and their GPU budget by it: Star Fox keeps only "tier 0" (byte +0xa of its mode event, `main+0xba69970`) and renders 0.8 times smaller below it; Bananza's code (read from the disassembly, `main+0x30f840`) scales its frame buffer by {1.0, 0.8, 2/3}[tier] and adds 0, 9 or 13 to the GPU time its dynamic resolution counts. A docked picture smaller than the handheld one, on a GPU about twice as fast, is not what the console does, and Star Fox's console footage matches tier 0: Peppy's close-up 65 s into it has a mean gradient of 5.8 (x1000, luminance at 1080p), tier 0 here 5.3, tier 1 4.6. +- **Fix:** tier 0 in both modes (`hle_oe.c`; check: `t_oe`). `DM_GFX_SCALE=1` or `2` answers a reduced tier, to see what a game does with less of the GPU. +- **Found on:** [Star Fox](../../dm/games/0400E88025B1A000/README.md) (docked: scene 960x540 to its 1920x1080 window, as handheld); [Donkey Kong Bananza](../../dm/games/040074A01BF12000/README.md) reads the tier too; its docked frame buffer with tier 0 was not measured on `main`. Star Fox's sizes were measured on a build of our fork (MetalFX temporal, `HOST_OPT -O3`), not on `main`. + ### The startup logo - **Symptom:** abort in `nn::sm::Initialize` under `nn::oe::FinishStartupLogo`, right after the first frames. @@ -1013,6 +1020,8 @@ Most service calls can be found before they crash, before the first boot or the - **Symptom:** `CRASH sig=11 addr=0 pc=sdk+0x6be4d4` in `nn::chat::GetChattingUid()`, from the game's title screen code. - **Cause:** SDK 21 games ask the chat library who is chatting, for the room, the sharing key, the virtual camera, the members' audio levels and the camera streams; the SDK's versions read the service object `Initialize` would have made. - **Fix:** hooked as "no chat" (`hle_misc.c`): a zero Uid, `GetRoomInfo` fails (with `RES_FAIL`, the chat library's real result not being known), the sharing and virtual camera calls succeed and keep nothing, the camera streaming calls succeed and stream nothing, the next-image requests fail, no audio levels. +- **The virtual camera's window:** a picture the game draws itself (Star Fox's avatar, in its avatar settings), which GameChat would send as the player's camera. The game makes an NVN window of `GetVirtualCameraNativeWindowHandle`'s answer (`main+0xba540a0`, with no check for 0) and presents into it, and the host shows every window it is given, over the game's picture. The handle is the host's off-screen native window (`dm_native_window_offscreen`): an NVN window on it drops its frames, its acquire does not wait for the display, and its presents are not the game's frames (`hle_nvn.c`). `t_pctl` checks the handle, `t_nvn` the window. +- **Also seen:** the chat library's own failure for a service call that fails is 0x4e2 (module 0xe2; `sdk+0x6c1194`, its audio stream calls), a candidate for `GetRoomInfo`'s answer. - **Found on:** [Star Fox](../../dm/games/0400E88025B1A000/README.md): 33 `nn::chat` imports. ### The camera through the graphics system @@ -1050,6 +1059,13 @@ Most service calls can be found before they crash, before the first boot or the - **Fix:** `hle_vi.c` answers as a Switch 2 does: in handheld mode its own 1080p screen; in console mode the largest of the four that the display the game is shown on holds, as a docked Switch 2 does with its TV. The display's size comes from the front end (`front_display_pixels`: on the Mac the window's screen in its current mode, an iPhone's or iPad's screen), 1080p when it is not known. The host logs the answer once. - **Found on:** [Fire Emblem Fortune's Weave](../../dm/games/04007EF01F8AE000/README.md): its DLSS output is 2048x1152 for 1440p and for 4K, from 1024x576; for 1080p it renders 960x540 into 1920x1080, a fifth fewer pixels at each stage, and the output matches the screen. +### The display's largest layer + +- **Symptom:** a Switch 2 game outputs 1920x1080 docked on a 4K screen, its scene a quarter of that, softer than console footage from a 4K TV: Star Fox rendered 960x540 for a 1080p window that the present stretched to the screen. +- **Cause:** `nn::vi::ListDisplays` gives each display's largest layer, and the host answered 1920x1080, a Switch 1's. A Switch 2 game sizes its output by it: Star Fox's window manager keeps it (`main+0xba66a78`), its output is the smaller of it and [the largest buffer](#the-displays-largest-buffer) (`main+0xb448874`), and its data's scale for a Switch 2 docked (`render.resolution_scale_console` 0.5, `data/eclipse/cvars/game.cvar`) gives the scene, which DLSS anti-aliases and its NDSR network doubles. The two answers only differ for a game when the layer is the smaller. +- **Fix:** for a Switch 2 build (`dm_sdk_ounce`) the largest layer is the largest buffer, the picture the display shows now: the 1080p screen handheld, docked the largest of 720p / 1080p / 1440p / 4K the screen holds (`hle_vi.c`; a Switch 1 build keeps 1920x1080). Check: `t_vi_display`. +- **Found on:** [Star Fox](../../dm/games/0400E88025B1A000/README.md): docked on a 5K screen it outputs 3840x2160 from a 1920x1080 scene (DLSS 1920x1080, NDSR 1920x1080 → 3840x2160), where it was 960x540 → 1920x1080; GPU p50 in the intro 12.4 against 7.3 ms. + ### A game that decodes its code at run time - **Symptom:** `registered NROs not found` from `nro_collect.py` in a game whose RomFS has an NRR, or `[RED] ro::LoadModule: no rewritten NRO with SHA-256 …`. `main` is small (about 600 KB of code) beside a data segment of random-looking bytes. diff --git a/docs/settings.md b/docs/settings.md index 69c3aca89a..103b613890 100644 --- a/docs/settings.md +++ b/docs/settings.md @@ -3,7 +3,7 @@ The screen before the game starts shows the settings the game supports. A setting that only matters while another is on appears under it and disappears when that one is turned off. Tap **Play** to start; the app remembers your choices for the next start. All settings are on one scrollable screen, under **Game**, **Controls** and **Performance**. Tap a menu or move a slider there; no settings page needs opening. **Upscaling** is in **Game**, beside **Console mode**. A Mac app shows the same settings in a [window of its own](#the-mac-settings-window). - [Tested defaults](#tested-defaults) -- [Game](#game): [Frame rate](#frame-rate), [Render scale](#render-scale), [Console mode](#console-mode), [Upscaling](#upscaling), [Game's upscaler](#games-upscaler), [Game language](#game-language), [Picture](#picture), [Frame-rate counter](#frame-rate-counter) +- [Game](#game): [Frame rate](#frame-rate), [Render scale](#render-scale), [Resolution](#resolution), [Console mode](#console-mode), [Upscaling](#upscaling), [Game's upscaler](#games-upscaler), [Game language](#game-language), [Picture](#picture), [Frame-rate counter](#frame-rate-counter) - [Controls](#controls): [Touch feedback](#touch-feedback), [Game rumble](#game-rumble), [Rumble strength](#rumble-strength), [Rumble cutoff](#rumble-cutoff) - [Performance](#performance): [Frame buffering](#frame-buffering), [Metal 4 pipelines](#metal-4-pipelines), [Pipeline prebuild](#pipeline-prebuild), [Encode thread](#encode-thread), [Hold frames when late](#hold-frames-when-late), [Performance HUD](#performance-hud), [Reset to tested defaults](#reset-to-tested-defaults) - [The Mac settings window](#the-mac-settings-window): [Display mode](#display-mode) @@ -31,6 +31,10 @@ On a Mac, a game checked at that speed (Fire Emblem Fortune's Weave, Mario & Lui The size of the 3D picture, from 50 to 100 %. Below 100 % the size is fixed there and the game's own dynamic resolution is off; 100 % keeps the game's own. Lower can be lighter on the GPU but is blurrier; the HUD and text keep their sharpness. Only games the app can scale offer it. +### Resolution + +How much of the output picture the game renders its scene at before its own upscaler fills it. **Game's own** keeps the game's choice (Star Fox: 50 % docked, 83 % handheld); the output follows the screen docked, up to 4K, so 100 % on a 4K screen renders 4K; **75 %** and **100 %** look sharper and take more GPU time, so the frame rate can drop. Only games the app can change offer it. + ### Console mode **Docked** renders at the Switch's TV resolution, **Handheld** at its lower handheld resolution, which is lighter on the phone and can give a higher frame rate. @@ -253,6 +257,7 @@ A line like `DM_PRESENT_SNAP=0` in `Documents/env.txt` (in the Files app, under |---|---|---| | Frame rate | `DM_FPS_TARGET` | `30`, `60`, `120` (Mac, games with `fps_max 120`) | | Render scale | `DM_RENDER_SCALE` | `0.5` to `1.0` | +| Resolution | `DM_RESOLUTION_SCALE` | `0` the game's own, `0.25` to `1.0` | | Console mode | `DM_OPMODE` | `1` docked, `0` handheld | | Game language | `DM_LANG` | a language code, such as `ja` | | Display mode (Mac) | `DM_FULLSCREEN` | `1` fullscreen, `0` a window |