> AI agents: this is one page from PostHog's docs. Full index of Markdown docs for LLMs: https://posthog.com/llms.txt # The page people can't leave – Self-driving pocket guide [](/pocket-guides.md)Aa [](/pocket-guides/self-driving/costly-ai-users.md)[](/pocket-guides/self-driving/ai-error-patterns.md) # The page people can't leave – Self-driving pocket guide Some failures throw an exception. Someone gets paged, a ticket gets filed, and the fix is obvious. Others don't. People land on a page, try a few things, and leave because they're stuck. No exceptions, no explosions, just bad business logic or poorly designed UX. This scout watches for pages that quietly become dead ends. ## What the scout looks at This scout looks at results from a Replay Vision scanner. Replay Vision scanner answers a question you configure by watching every session you capture, forever and on repeat. The output becomes a queryable signal that this scout uses to identify dead ends. [Dead endsMonitor“Did the user appear stuck on a page?”Every session comes back yes or no · `scanner_output_verdict`](https://app.posthog.com/replay-vision/new/details?template=dead_end) To support this verdict, the scout looks for the shape a single session can't show: - **The same person, more than once.** Someone who abandons a flow and never returns is normal. Someone who comes back, lands on the same step, and leaves again is stuck. - **No completion event between the visits.** They aren't finishing it later somewhere else. - **What they did before giving up.** Rage clicks on a button that won't advance, the same field retyped three times, clicks on nav links that bounce straight back, a reload, then nothing. This is the part only a recording has – the events say they left, the replay says what they tried. ## The report in your inbox When people keep getting sent back to a page they can't get past, a [scout](/docs/self-driving/scouts.md) opens a [report](/docs/self-driving/reports.md) Fig. 1. Click **Review** and it opens Fig. 2 with the repeat visits, the recordings, and what the app was doing instead. P21Accounts that left onboarding midway can no longer finish it 2Accounts that left onboarding midway can't get past step two. The workspace they created last time blocks them, and the name it holds is their own3Scout · dead-end pages4ReadyActionable55h ago ArchiveReview6 Fig. 1 – The report card in your inbox. The claim and the triage sit on the card; the recordings sit inside the report.Hover over the figure to learn about each element. P2Accounts that left onboarding midway can no longer finish it 1ReadyActionableScout · dead-end pages· 5h ago ArchiveCreate PR2 Summary3 Sessions reaching `/onboarding/step-1` now end there 41% of the time, up from 9% across the trailing two weeks. Signup volume is unchanged and nothing threw. These are returning accounts, not new ones. Onboarding creates the workspace at step two and writes `onboarding_complete` at step four. Anyone who leaves between the two has a workspace but an incomplete account, so the route guard sends every later visit back to step one. Step two then tries to create the workspace again and gets a 409 – the name is taken by the workspace they created last time. The form renders it as a validation message under the name field, so it reads as their mistake. There's no resume, no skip, and nothing in onboarding that can see or delete the workspace already sitting on the account. The recordings are people trying variations of their own company name against the same wall. Median four attempts before the tab closes. Twenty-three accounts have now done this on three or more separate days. ~180 accounts stuck, ~40 more each day **Suggested fix:** Have step two adopt the existing workspace instead of creating a second one, and let the guard resume at the first unfinished step. The 409 is correct – treating it as user error is what makes it a trap. 4 Evidence3 sources5 Session ReplayRage clicks, dead clicks, and the recordings themselves – the only place a failure that never threw leaves a trace. Replay VisionYour scanners' verdicts on the same sessions, when you run them, so the report can cite a dead-end count rather than infer one. Your product eventsWhere sessions end, and whether the people who reach a page can go anywhere afterwards – compared with the last two weeks. Fig. 2 – The report opened. The recordings are the evidence here, so they're what you review first.Hover over the figure to learn about each element. The recordings carry more weight here than in most reports. The numbers tell you people leave. The sessions tell you what they tried first, which is usually what names the cause. ## The pull request you merge When you're ready, PostHog dispatches an agent with the report and its evidence as context. You review and merge like any other PR – nothing merges without you. Reports are free. Pull requests are **$15 each**, with your first three a month **free**. See self-driving [Pricing](/docs/self-driving/pricing.md). ## The scout itself Scouts are instructions an agent follows on a schedule – Fig. 3 is the skill file for this one. signals-scout-dead-end-pages/SKILL.md ```markdown # Signals scout: dead-end pages You are a focused state-trap scout. Products gate access behind flows — onboarding, email verification, workspace setup — and a route guard sends anyone with incomplete state back to the start of one. That guard is doing its job. Your job is the case where it has become a wall: the person cannot complete the flow, so the guard fires again on every visit, and they never reach the product. **Incompletable-vs-merely-unfinished is the discriminator.** Someone who abandoned onboarding and hasn't come back is baseline — most people who start a flow don't finish it in one sitting. Signal is a person who *returns*, is redirected to the same step, and leaves again, repeatedly. Compare a gated page against its own history, never an absolute bar: a step that has always shed half its arrivals is how that flow works. The mechanism worth naming, because it is the usual cause: a flow with side effects and no way to reconcile them. Step two creates something, step four marks the account complete, and the write that marks completion never happens. On return, the guard sends the person back to step two, which tries to create what already exists and refuses. The refusal is a handled response — a validation message, not an exception — so **nothing throws, nothing alerts, and the funnel counts every attempt**. The only trace is in the recordings. ## Boundaries — read before authoring Three sibling scouts own neighbouring surfaces. Check `inbox-reports-list` before you author, and cite any overlapping report rather than restating it. - **`signals-scout-session-replay`** owns raw friction: rage-click and dead-click concentration on a page or element, and recording capture integrity. If your finding is "this element is frustrating", it is theirs. Yours is "this person cannot get past this step, across visits". - **`signals-scout-replay-vision`** owns scanner machinery and aggregate scanner drift — a monitor's yes-rate creeping up, a scanner that stopped observing. You *read* scanner output as evidence; you do not report on the scanner itself. - **`signals-scout-silent-failure`** owns one named core action's completion rate, and looks for a swallowed exception behind a drop. Yours is defined by there being no exception to find, and starts from the gated page rather than the flow. If a scanner on this surface has `emits_signals: true`, it is already pushing one signal per session into this same inbox. Never re-author what it pushed. Your finding must add what a per-session push structurally cannot: the same person, the same forced page, across days. ## SQL footguns 1. **Client clocks lie.** Sessions and events arrive dated into the future. Upper-bound every recency window (`AND timestamp <= now() + INTERVAL 1 DAY`) and never trust `ORDER BY timestamp DESC LIMIT 1` to mean "latest" without it. 2. **On `$recording_observed`, count reach with `uniq(session_id)`, never `uniq(person_id)`.** The event's `distinct_id` is a synthetic per-team scanner id for scheduled scans, not the end user. 3. **Group scanners by `scanner_id`, never `scanner_name`.** The name is snapshotted per observation, so a rename splits one scanner's history in two. Carry the name as a label via `argMax(properties.scanner_name, timestamp)`. 4. **`scanner_output_tags` is a JSON-encoded array**, not a native one. `JSONExtract(..., 'Array(String)')` before `arrayJoin`, and union `scanner_output_tags_freeform` or you miss the freeform tags. 5. **Only succeeded observations write `$recording_observed`.** Zero events can mean "no scanner" or "every observation failing" — `vision-scanners-observations-list` with a `status` filter is the only way to tell. ## The discriminator Emit a report when, for a gated page, **returning people are redirected to it and leave without completing, at a rate that has stepped away from that page's trailing two-week norm for the same day of week**. Three things have to hold together: 1. **Repeat arrivals.** The same person reaching the page on separate sessions, ideally separate days. One visit is someone who got distracted; four is a wall. 2. **No completion event** between the first arrival and the last, on any of those visits. 3. **No matching exception**, where Error Tracking is connected. If something threw, the error signals already have it — skip this check rather than blocking on it when Error Tracking isn't in play, because the recordings still say what happened. Where a Replay Vision dead-end monitor or session-outcome classifier is configured, lead the claim with it — a verdict is a per-session judgment that the person was stuck, rather than an inference from where clicking stopped. Name the scanner so the reader can open the observations. ### Write nothing when - The page is a natural terminus. Order confirmation, docs, a thank-you page — anywhere leaving is the successful outcome. Learn these from the trailing norm, not a hardcoded list. - Arrivals are first-time rather than returning. That is a flow with a drop-off, not a trap, and it belongs to whoever owns that funnel. - Traffic to the page changed enough to explain the rate on its own. - Exceptions rose alongside it, per the third condition above. ### The bar A page needs enough sessions for the rate to mean anything. Skip anything under 50 sessions in the window, and raise that floor if you shorten the interval. Daily is the fleet default — traps build over days, and a shorter interval mostly adds noise. ## What to gather before writing The report has to name what is blocking people, not just a page and a number. 1. **The rate and its norm** — what it was, what it is, over how many sessions. 2. **The repeat shape** — how many distinct people, how many visits each, over how many days, and how many have never once reached the product. 3. **Replay Vision output**, where a scanner exists: the dead-end monitor's verdict-yes count or the classifier's `task_abandoned` share, cited by scanner name. 4. **What they do before giving up** — this is the part only the recordings have, and it's what turns a rate into a cause. Look for: rage clicks on the control that should advance them, the same field edited and resubmitted several times, attempts to navigate away that the guard bounces straight back, a reload, and dwell time that's long rather than short. Someone who leaves in four seconds bounced; someone who spent ninety seconds trying was blocked. 5. **Three to five recordings**, chosen for what they show rather than recency: prefer a person's second or third visit, where the repetition is visible. 6. **Deploys touching that route**, if the codebase is connected. 7. **Exceptions on that path**, if Error Tracking is connected — enough to confirm the silence. ## Writing the report Lead with the flow and who is stuck in it, not the page's exit rate. State what the person is trying to do, what the app does instead, and why the app thinks it is right — a guard firing on incomplete state is correct behaviour, and the report reads as nonsense without that. Suggest a fix only when the evidence supports one. "Step two returns a conflict because the workspace it wants to create already exists on the account" is a fix. "Improve onboarding" is not, and is worse than saying you don't know. ``` Show full example Fig. 3 – The scout itself – the file an agent follows on a schedule. It reads several [signal sources](/docs/self-driving/inbox/sources.md). Error Tracking is the odd one out: the scout checks it to decide when to stay quiet. Scanners can answer a lot more than this. [Replay Vision](/pocket-guides/session-replay/replay-vision.md) covers what else you can ask them. ## The schedule it runs on This scout runs **daily** by default. Dead ends build over days rather than minutes, so a shorter interval mostly adds noise. It only writes when something is wrong, so most days it's silent. ## Add this to your scout troop You'll need these to run this scout. - Required[Session Replay](/docs/session-replay/installation.md) enabled, since the recordings are the evidence rather than the colour - RequiredA Replay Vision dead-end monitor or session-outcome classifier, which turns "people leave here" into a verdict per session rather than an inference from where clicking stopped - Recommended[Error Tracking](/docs/error-tracking/installation.md) instrumented, so a page that's throwing gets left to your error signals instead of reported twice - Recommended[Your codebase](/docs/self-driving/context.md) connected via GitHub, to match a new dead end against the deploy that made it - OptionalConversion or navigation events on the pages you care about, if you have them – they're what separates leaving from finishing [Add this scout](https://app.posthog.com/inbox/config#createScout=eyJuYW1lIjoic2lnbmFscy1zY291dC1kZWFkLWVuZC1wYWdlcyIsImRlc2NyaXB0aW9uIjoiQ3VzdG9tIFNpZ25hbHMgc2NvdXQgZm9yIHN0YXRlIHRyYXBzIGluIGdhdGVkIGZsb3dzLiBXYXRjaGVzIHBhZ2VzIHVzZXJzIGFyZSByZWRpcmVjdGVkICp0byog4oCUIG9uYm9hcmRpbmcsIHZlcmlmaWNhdGlvbiwgc2V0dXAg4oCUIGFuZCBjYXRjaGVzIHRoZSBjYXNlIHdoZXJlIHRoZSByZWRpcmVjdCBrZWVwcyBmaXJpbmcgYmVjYXVzZSB0aGUgZmxvdyBjYW4gbm8gbG9uZ2VyIGJlIGNvbXBsZXRlZDogYSBwYXJ0aWFsbHktYXBwbGllZCBzaWRlIGVmZmVjdCB0aGUgZmxvdyBjYW4ndCByZWNvbmNpbGUsIHNvIGV2ZXJ5IHJldHVybiB2aXNpdCBsYW5kcyBvbiB0aGUgc2FtZSB3YWxsLiBRdWFudGlmaWVzIG9uIHRoZSBldmVudHMgc3RyZWFtIChyZXBlYXQgYXJyaXZhbHMgcGVyIHBlcnNvbiwgbm8gY29tcGxldGlvbiBldmVudCwgbm8gZXhjZXB0aW9uKSwgbGVhZHMgdGhlIGNsYWltIHdpdGggUmVwbGF5IFZpc2lvbiBkZWFkLWVuZCB2ZXJkaWN0cyB3aGVyZSBhIHNjYW5uZXIgaXMgY29uZmlndXJlZCwgYW5kIGlsbHVzdHJhdGVzIHdpdGggdGhlIHJlY29yZGluZ3MgdGhhdCBzaG93IHdoYXQgcGVvcGxlIHRyeSBiZWZvcmUgdGhleSBnaXZlIHVwLiBGaWxlcyBlYWNoIHZhbGlkYXRlZCB0cmFwIGFzIGEgcmVwb3J0IGluIHRoZSBpbmJveDsgd3JpdGVzIG5vdGhpbmcgd2hlbiB0aGUgcmVkaXJlY3QgaXMgd29ya2luZyBhcyBpbnRlbmRlZC5cbiIsImJvZHkiOiIjIFNpZ25hbHMgc2NvdXQ6IGRlYWQtZW5kIHBhZ2VzXG5cbllvdSBhcmUgYSBmb2N1c2VkIHN0YXRlLXRyYXAgc2NvdXQuIFByb2R1Y3RzIGdhdGUgYWNjZXNzIGJlaGluZCBmbG93cyDigJQgb25ib2FyZGluZywgZW1haWxcbnZlcmlmaWNhdGlvbiwgd29ya3NwYWNlIHNldHVwIOKAlCBhbmQgYSByb3V0ZSBndWFyZCBzZW5kcyBhbnlvbmUgd2l0aCBpbmNvbXBsZXRlIHN0YXRlIGJhY2sgdG8gdGhlXG5zdGFydCBvZiBvbmUuIFRoYXQgZ3VhcmQgaXMgZG9pbmcgaXRzIGpvYi4gWW91ciBqb2IgaXMgdGhlIGNhc2Ugd2hlcmUgaXQgaGFzIGJlY29tZSBhIHdhbGw6IHRoZVxucGVyc29uIGNhbm5vdCBjb21wbGV0ZSB0aGUgZmxvdywgc28gdGhlIGd1YXJkIGZpcmVzIGFnYWluIG9uIGV2ZXJ5IHZpc2l0LCBhbmQgdGhleSBuZXZlciByZWFjaCB0aGVcbnByb2R1Y3QuXG5cbioqSW5jb21wbGV0YWJsZS12cy1tZXJlbHktdW5maW5pc2hlZCBpcyB0aGUgZGlzY3JpbWluYXRvci4qKiBTb21lb25lIHdobyBhYmFuZG9uZWQgb25ib2FyZGluZyBhbmRcbmhhc24ndCBjb21lIGJhY2sgaXMgYmFzZWxpbmUg4oCUIG1vc3QgcGVvcGxlIHdobyBzdGFydCBhIGZsb3cgZG9uJ3QgZmluaXNoIGl0IGluIG9uZSBzaXR0aW5nLiBTaWduYWxcbmlzIGEgcGVyc29uIHdobyAqcmV0dXJucyosIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHNhbWUgc3RlcCwgYW5kIGxlYXZlcyBhZ2FpbiwgcmVwZWF0ZWRseS4gQ29tcGFyZSBhXG5nYXRlZCBwYWdlIGFnYWluc3QgaXRzIG93biBoaXN0b3J5LCBuZXZlciBhbiBhYnNvbHV0ZSBiYXI6IGEgc3RlcCB0aGF0IGhhcyBhbHdheXMgc2hlZCBoYWxmIGl0c1xuYXJyaXZhbHMgaXMgaG93IHRoYXQgZmxvdyB3b3Jrcy5cblxuVGhlIG1lY2hhbmlzbSB3b3J0aCBuYW1pbmcsIGJlY2F1c2UgaXQgaXMgdGhlIHVzdWFsIGNhdXNlOiBhIGZsb3cgd2l0aCBzaWRlIGVmZmVjdHMgYW5kIG5vIHdheSB0b1xucmVjb25jaWxlIHRoZW0uIFN0ZXAgdHdvIGNyZWF0ZXMgc29tZXRoaW5nLCBzdGVwIGZvdXIgbWFya3MgdGhlIGFjY291bnQgY29tcGxldGUsIGFuZCB0aGUgd3JpdGVcbnRoYXQgbWFya3MgY29tcGxldGlvbiBuZXZlciBoYXBwZW5zLiBPbiByZXR1cm4sIHRoZSBndWFyZCBzZW5kcyB0aGUgcGVyc29uIGJhY2sgdG8gc3RlcCB0d28sIHdoaWNoXG50cmllcyB0byBjcmVhdGUgd2hhdCBhbHJlYWR5IGV4aXN0cyBhbmQgcmVmdXNlcy4gVGhlIHJlZnVzYWwgaXMgYSBoYW5kbGVkIHJlc3BvbnNlIOKAlCBhIHZhbGlkYXRpb25cbm1lc3NhZ2UsIG5vdCBhbiBleGNlcHRpb24g4oCUIHNvICoqbm90aGluZyB0aHJvd3MsIG5vdGhpbmcgYWxlcnRzLCBhbmQgdGhlIGZ1bm5lbCBjb3VudHMgZXZlcnlcbmF0dGVtcHQqKi4gVGhlIG9ubHkgdHJhY2UgaXMgaW4gdGhlIHJlY29yZGluZ3MuXG5cbiMjIEJvdW5kYXJpZXMg4oCUIHJlYWQgYmVmb3JlIGF1dGhvcmluZ1xuXG5UaHJlZSBzaWJsaW5nIHNjb3V0cyBvd24gbmVpZ2hib3VyaW5nIHN1cmZhY2VzLiBDaGVjayBgaW5ib3gtcmVwb3J0cy1saXN0YCBiZWZvcmUgeW91IGF1dGhvciwgYW5kXG5jaXRlIGFueSBvdmVybGFwcGluZyByZXBvcnQgcmF0aGVyIHRoYW4gcmVzdGF0aW5nIGl0LlxuXG4tICoqYHNpZ25hbHMtc2NvdXQtc2Vzc2lvbi1yZXBsYXlgKiogb3ducyByYXcgZnJpY3Rpb246IHJhZ2UtY2xpY2sgYW5kIGRlYWQtY2xpY2sgY29uY2VudHJhdGlvbiBvblxuICBhIHBhZ2Ugb3IgZWxlbWVudCwgYW5kIHJlY29yZGluZyBjYXB0dXJlIGludGVncml0eS4gSWYgeW91ciBmaW5kaW5nIGlzIFwidGhpcyBlbGVtZW50IGlzXG4gIGZydXN0cmF0aW5nXCIsIGl0IGlzIHRoZWlycy4gWW91cnMgaXMgXCJ0aGlzIHBlcnNvbiBjYW5ub3QgZ2V0IHBhc3QgdGhpcyBzdGVwLCBhY3Jvc3MgdmlzaXRzXCIuXG4tICoqYHNpZ25hbHMtc2NvdXQtcmVwbGF5LXZpc2lvbmAqKiBvd25zIHNjYW5uZXIgbWFjaGluZXJ5IGFuZCBhZ2dyZWdhdGUgc2Nhbm5lciBkcmlmdCDigJQgYVxuICBtb25pdG9yJ3MgeWVzLXJhdGUgY3JlZXBpbmcgdXAsIGEgc2Nhbm5lciB0aGF0IHN0b3BwZWQgb2JzZXJ2aW5nLiBZb3UgKnJlYWQqIHNjYW5uZXIgb3V0cHV0IGFzXG4gIGV2aWRlbmNlOyB5b3UgZG8gbm90IHJlcG9ydCBvbiB0aGUgc2Nhbm5lciBpdHNlbGYuXG4tICoqYHNpZ25hbHMtc2NvdXQtc2lsZW50LWZhaWx1cmVgKiogb3ducyBvbmUgbmFtZWQgY29yZSBhY3Rpb24ncyBjb21wbGV0aW9uIHJhdGUsIGFuZCBsb29rcyBmb3IgYVxuICBzd2FsbG93ZWQgZXhjZXB0aW9uIGJlaGluZCBhIGRyb3AuIFlvdXJzIGlzIGRlZmluZWQgYnkgdGhlcmUgYmVpbmcgbm8gZXhjZXB0aW9uIHRvIGZpbmQsIGFuZFxuICBzdGFydHMgZnJvbSB0aGUgZ2F0ZWQgcGFnZSByYXRoZXIgdGhhbiB0aGUgZmxvdy5cblxuSWYgYSBzY2FubmVyIG9uIHRoaXMgc3VyZmFjZSBoYXMgYGVtaXRzX3NpZ25hbHM6IHRydWVgLCBpdCBpcyBhbHJlYWR5IHB1c2hpbmcgb25lIHNpZ25hbCBwZXJcbnNlc3Npb24gaW50byB0aGlzIHNhbWUgaW5ib3guIE5ldmVyIHJlLWF1dGhvciB3aGF0IGl0IHB1c2hlZC4gWW91ciBmaW5kaW5nIG11c3QgYWRkIHdoYXQgYVxucGVyLXNlc3Npb24gcHVzaCBzdHJ1Y3R1cmFsbHkgY2Fubm90OiB0aGUgc2FtZSBwZXJzb24sIHRoZSBzYW1lIGZvcmNlZCBwYWdlLCBhY3Jvc3MgZGF5cy5cblxuIyMgU1FMIGZvb3RndW5zXG5cbjEuICoqQ2xpZW50IGNsb2NrcyBsaWUuKiogU2Vzc2lvbnMgYW5kIGV2ZW50cyBhcnJpdmUgZGF0ZWQgaW50byB0aGUgZnV0dXJlLiBVcHBlci1ib3VuZCBldmVyeVxuICAgcmVjZW5jeSB3aW5kb3cgKGBBTkQgdGltZXN0YW1wIDw9IG5vdygpICsgSU5URVJWQUwgMSBEQVlgKSBhbmQgbmV2ZXIgdHJ1c3RcbiAgIGBPUkRFUiBCWSB0aW1lc3RhbXAgREVTQyBMSU1JVCAxYCB0byBtZWFuIFwibGF0ZXN0XCIgd2l0aG91dCBpdC5cbjIuICoqT24gYCRyZWNvcmRpbmdfb2JzZXJ2ZWRgLCBjb3VudCByZWFjaCB3aXRoIGB1bmlxKHNlc3Npb25faWQpYCwgbmV2ZXIgYHVuaXEocGVyc29uX2lkKWAuKiogVGhlXG4gICBldmVudCdzIGBkaXN0aW5jdF9pZGAgaXMgYSBzeW50aGV0aWMgcGVyLXRlYW0gc2Nhbm5lciBpZCBmb3Igc2NoZWR1bGVkIHNjYW5zLCBub3QgdGhlIGVuZCB1c2VyLlxuMy4gKipHcm91cCBzY2FubmVycyBieSBgc2Nhbm5lcl9pZGAsIG5ldmVyIGBzY2FubmVyX25hbWVgLioqIFRoZSBuYW1lIGlzIHNuYXBzaG90dGVkIHBlclxuICAgb2JzZXJ2YXRpb24sIHNvIGEgcmVuYW1lIHNwbGl0cyBvbmUgc2Nhbm5lcidzIGhpc3RvcnkgaW4gdHdvLiBDYXJyeSB0aGUgbmFtZSBhcyBhIGxhYmVsIHZpYVxuICAgYGFyZ01heChwcm9wZXJ0aWVzLnNjYW5uZXJfbmFtZSwgdGltZXN0YW1wKWAuXG40LiAqKmBzY2FubmVyX291dHB1dF90YWdzYCBpcyBhIEpTT04tZW5jb2RlZCBhcnJheSoqLCBub3QgYSBuYXRpdmUgb25lLiBgSlNPTkV4dHJhY3QoLi4uLCAnQXJyYXkoU3RyaW5nKScpYFxuICAgYmVmb3JlIGBhcnJheUpvaW5gLCBhbmQgdW5pb24gYHNjYW5uZXJfb3V0cHV0X3RhZ3NfZnJlZWZvcm1gIG9yIHlvdSBtaXNzIHRoZSBmcmVlZm9ybSB0YWdzLlxuNS4gKipPbmx5IHN1Y2NlZWRlZCBvYnNlcnZhdGlvbnMgd3JpdGUgYCRyZWNvcmRpbmdfb2JzZXJ2ZWRgLioqIFplcm8gZXZlbnRzIGNhbiBtZWFuIFwibm8gc2Nhbm5lclwiXG4gICBvciBcImV2ZXJ5IG9ic2VydmF0aW9uIGZhaWxpbmdcIiDigJQgYHZpc2lvbi1zY2FubmVycy1vYnNlcnZhdGlvbnMtbGlzdGAgd2l0aCBhIGBzdGF0dXNgIGZpbHRlciBpc1xuICAgdGhlIG9ubHkgd2F5IHRvIHRlbGwuXG5cbiMjIFRoZSBkaXNjcmltaW5hdG9yXG5cbkVtaXQgYSByZXBvcnQgd2hlbiwgZm9yIGEgZ2F0ZWQgcGFnZSwgKipyZXR1cm5pbmcgcGVvcGxlIGFyZSByZWRpcmVjdGVkIHRvIGl0IGFuZCBsZWF2ZSB3aXRob3V0XG5jb21wbGV0aW5nLCBhdCBhIHJhdGUgdGhhdCBoYXMgc3RlcHBlZCBhd2F5IGZyb20gdGhhdCBwYWdlJ3MgdHJhaWxpbmcgdHdvLXdlZWsgbm9ybSBmb3IgdGhlIHNhbWVcbmRheSBvZiB3ZWVrKiouXG5cblRocmVlIHRoaW5ncyBoYXZlIHRvIGhvbGQgdG9nZXRoZXI6XG5cbjEuICoqUmVwZWF0IGFycml2YWxzLioqIFRoZSBzYW1lIHBlcnNvbiByZWFjaGluZyB0aGUgcGFnZSBvbiBzZXBhcmF0ZSBzZXNzaW9ucywgaWRlYWxseSBzZXBhcmF0ZVxuICAgZGF5cy4gT25lIHZpc2l0IGlzIHNvbWVvbmUgd2hvIGdvdCBkaXN0cmFjdGVkOyBmb3VyIGlzIGEgd2FsbC5cbjIuICoqTm8gY29tcGxldGlvbiBldmVudCoqIGJldHdlZW4gdGhlIGZpcnN0IGFycml2YWwgYW5kIHRoZSBsYXN0LCBvbiBhbnkgb2YgdGhvc2UgdmlzaXRzLlxuMy4gKipObyBtYXRjaGluZyBleGNlcHRpb24qKiwgd2hlcmUgRXJyb3IgVHJhY2tpbmcgaXMgY29ubmVjdGVkLiBJZiBzb21ldGhpbmcgdGhyZXcsIHRoZSBlcnJvclxuICAgc2lnbmFscyBhbHJlYWR5IGhhdmUgaXQg4oCUIHNraXAgdGhpcyBjaGVjayByYXRoZXIgdGhhbiBibG9ja2luZyBvbiBpdCB3aGVuIEVycm9yIFRyYWNraW5nIGlzbid0XG4gICBpbiBwbGF5LCBiZWNhdXNlIHRoZSByZWNvcmRpbmdzIHN0aWxsIHNheSB3aGF0IGhhcHBlbmVkLlxuXG5XaGVyZSBhIFJlcGxheSBWaXNpb24gZGVhZC1lbmQgbW9uaXRvciBvciBzZXNzaW9uLW91dGNvbWUgY2xhc3NpZmllciBpcyBjb25maWd1cmVkLCBsZWFkIHRoZSBjbGFpbVxud2l0aCBpdCDigJQgYSB2ZXJkaWN0IGlzIGEgcGVyLXNlc3Npb24ganVkZ21lbnQgdGhhdCB0aGUgcGVyc29uIHdhcyBzdHVjaywgcmF0aGVyIHRoYW4gYW4gaW5mZXJlbmNlXG5mcm9tIHdoZXJlIGNsaWNraW5nIHN0b3BwZWQuIE5hbWUgdGhlIHNjYW5uZXIgc28gdGhlIHJlYWRlciBjYW4gb3BlbiB0aGUgb2JzZXJ2YXRpb25zLlxuXG4jIyMgV3JpdGUgbm90aGluZyB3aGVuXG5cbi0gVGhlIHBhZ2UgaXMgYSBuYXR1cmFsIHRlcm1pbnVzLiBPcmRlciBjb25maXJtYXRpb24sIGRvY3MsIGEgdGhhbmsteW91IHBhZ2Ug4oCUIGFueXdoZXJlIGxlYXZpbmcgaXNcbiAgdGhlIHN1Y2Nlc3NmdWwgb3V0Y29tZS4gTGVhcm4gdGhlc2UgZnJvbSB0aGUgdHJhaWxpbmcgbm9ybSwgbm90IGEgaGFyZGNvZGVkIGxpc3QuXG4tIEFycml2YWxzIGFyZSBmaXJzdC10aW1lIHJhdGhlciB0aGFuIHJldHVybmluZy4gVGhhdCBpcyBhIGZsb3cgd2l0aCBhIGRyb3Atb2ZmLCBub3QgYSB0cmFwLCBhbmQgaXRcbiAgYmVsb25ncyB0byB3aG9ldmVyIG93bnMgdGhhdCBmdW5uZWwuXG4tIFRyYWZmaWMgdG8gdGhlIHBhZ2UgY2hhbmdlZCBlbm91Z2ggdG8gZXhwbGFpbiB0aGUgcmF0ZSBvbiBpdHMgb3duLlxuLSBFeGNlcHRpb25zIHJvc2UgYWxvbmdzaWRlIGl0LCBwZXIgdGhlIHRoaXJkIGNvbmRpdGlvbiBhYm92ZS5cblxuIyMjIFRoZSBiYXJcblxuQSBwYWdlIG5lZWRzIGVub3VnaCBzZXNzaW9ucyBmb3IgdGhlIHJhdGUgdG8gbWVhbiBhbnl0aGluZy4gU2tpcCBhbnl0aGluZyB1bmRlciA1MCBzZXNzaW9ucyBpbiB0aGVcbndpbmRvdywgYW5kIHJhaXNlIHRoYXQgZmxvb3IgaWYgeW91IHNob3J0ZW4gdGhlIGludGVydmFsLiBEYWlseSBpcyB0aGUgZmxlZXQgZGVmYXVsdCDigJQgdHJhcHMgYnVpbGRcbm92ZXIgZGF5cywgYW5kIGEgc2hvcnRlciBpbnRlcnZhbCBtb3N0bHkgYWRkcyBub2lzZS5cblxuIyMgV2hhdCB0byBnYXRoZXIgYmVmb3JlIHdyaXRpbmdcblxuVGhlIHJlcG9ydCBoYXMgdG8gbmFtZSB3aGF0IGlzIGJsb2NraW5nIHBlb3BsZSwgbm90IGp1c3QgYSBwYWdlIGFuZCBhIG51bWJlci5cblxuMS4gKipUaGUgcmF0ZSBhbmQgaXRzIG5vcm0qKiDigJQgd2hhdCBpdCB3YXMsIHdoYXQgaXQgaXMsIG92ZXIgaG93IG1hbnkgc2Vzc2lvbnMuXG4yLiAqKlRoZSByZXBlYXQgc2hhcGUqKiDigJQgaG93IG1hbnkgZGlzdGluY3QgcGVvcGxlLCBob3cgbWFueSB2aXNpdHMgZWFjaCwgb3ZlciBob3cgbWFueSBkYXlzLCBhbmRcbiAgIGhvdyBtYW55IGhhdmUgbmV2ZXIgb25jZSByZWFjaGVkIHRoZSBwcm9kdWN0LlxuMy4gKipSZXBsYXkgVmlzaW9uIG91dHB1dCoqLCB3aGVyZSBhIHNjYW5uZXIgZXhpc3RzOiB0aGUgZGVhZC1lbmQgbW9uaXRvcidzIHZlcmRpY3QteWVzIGNvdW50IG9yXG4gICB0aGUgY2xhc3NpZmllcidzIGB0YXNrX2FiYW5kb25lZGAgc2hhcmUsIGNpdGVkIGJ5IHNjYW5uZXIgbmFtZS5cbjQuICoqV2hhdCB0aGV5IGRvIGJlZm9yZSBnaXZpbmcgdXAqKiDigJQgdGhpcyBpcyB0aGUgcGFydCBvbmx5IHRoZSByZWNvcmRpbmdzIGhhdmUsIGFuZCBpdCdzIHdoYXRcbiAgIHR1cm5zIGEgcmF0ZSBpbnRvIGEgY2F1c2UuIExvb2sgZm9yOiByYWdlIGNsaWNrcyBvbiB0aGUgY29udHJvbCB0aGF0IHNob3VsZCBhZHZhbmNlIHRoZW0sIHRoZVxuICAgc2FtZSBmaWVsZCBlZGl0ZWQgYW5kIHJlc3VibWl0dGVkIHNldmVyYWwgdGltZXMsIGF0dGVtcHRzIHRvIG5hdmlnYXRlIGF3YXkgdGhhdCB0aGUgZ3VhcmRcbiAgIGJvdW5jZXMgc3RyYWlnaHQgYmFjaywgYSByZWxvYWQsIGFuZCBkd2VsbCB0aW1lIHRoYXQncyBsb25nIHJhdGhlciB0aGFuIHNob3J0LiBTb21lb25lIHdob1xuICAgbGVhdmVzIGluIGZvdXIgc2Vjb25kcyBib3VuY2VkOyBzb21lb25lIHdobyBzcGVudCBuaW5ldHkgc2Vjb25kcyB0cnlpbmcgd2FzIGJsb2NrZWQuXG41LiAqKlRocmVlIHRvIGZpdmUgcmVjb3JkaW5ncyoqLCBjaG9zZW4gZm9yIHdoYXQgdGhleSBzaG93IHJhdGhlciB0aGFuIHJlY2VuY3k6IHByZWZlciBhIHBlcnNvbidzXG4gICBzZWNvbmQgb3IgdGhpcmQgdmlzaXQsIHdoZXJlIHRoZSByZXBldGl0aW9uIGlzIHZpc2libGUuXG42LiAqKkRlcGxveXMgdG91Y2hpbmcgdGhhdCByb3V0ZSoqLCBpZiB0aGUgY29kZWJhc2UgaXMgY29ubmVjdGVkLlxuNy4gKipFeGNlcHRpb25zIG9uIHRoYXQgcGF0aCoqLCBpZiBFcnJvciBUcmFja2luZyBpcyBjb25uZWN0ZWQg4oCUIGVub3VnaCB0byBjb25maXJtIHRoZSBzaWxlbmNlLlxuXG4jIyBXcml0aW5nIHRoZSByZXBvcnRcblxuTGVhZCB3aXRoIHRoZSBmbG93IGFuZCB3aG8gaXMgc3R1Y2sgaW4gaXQsIG5vdCB0aGUgcGFnZSdzIGV4aXQgcmF0ZS4gU3RhdGUgd2hhdCB0aGUgcGVyc29uIGlzXG50cnlpbmcgdG8gZG8sIHdoYXQgdGhlIGFwcCBkb2VzIGluc3RlYWQsIGFuZCB3aHkgdGhlIGFwcCB0aGlua3MgaXQgaXMgcmlnaHQg4oCUIGEgZ3VhcmQgZmlyaW5nIG9uXG5pbmNvbXBsZXRlIHN0YXRlIGlzIGNvcnJlY3QgYmVoYXZpb3VyLCBhbmQgdGhlIHJlcG9ydCByZWFkcyBhcyBub25zZW5zZSB3aXRob3V0IHRoYXQuXG5cblN1Z2dlc3QgYSBmaXggb25seSB3aGVuIHRoZSBldmlkZW5jZSBzdXBwb3J0cyBvbmUuIFwiU3RlcCB0d28gcmV0dXJucyBhIGNvbmZsaWN0IGJlY2F1c2UgdGhlXG53b3Jrc3BhY2UgaXQgd2FudHMgdG8gY3JlYXRlIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBhY2NvdW50XCIgaXMgYSBmaXguIFwiSW1wcm92ZSBvbmJvYXJkaW5nXCIgaXMgbm90LFxuYW5kIGlzIHdvcnNlIHRoYW4gc2F5aW5nIHlvdSBkb24ndCBrbm93LiIsInNvdXJjZSI6InBvY2tldF9ndWlkZSJ9)Opens PostHog with it prefilled. Review it, then hit Create. Not set up yet? One command installs PostHog, connects GitHub, and turns on a default troop of scouts. That troop doesn't include this one – add it above once you're set up. ``` npx @posthog/wizard self-driving ``` [‹ Costly users](/pocket-guides/self-driving/costly-ai-users.md)[All guides](/pocket-guides.md)p. 6 of 7[Error patterns ›](/pocket-guides/self-driving/ai-error-patterns.md) signals-scout-dead-end-pages[Add this scout](https://app.posthog.com/inbox/config#createScout=eyJuYW1lIjoic2lnbmFscy1zY291dC1kZWFkLWVuZC1wYWdlcyIsImRlc2NyaXB0aW9uIjoiQ3VzdG9tIFNpZ25hbHMgc2NvdXQgZm9yIHN0YXRlIHRyYXBzIGluIGdhdGVkIGZsb3dzLiBXYXRjaGVzIHBhZ2VzIHVzZXJzIGFyZSByZWRpcmVjdGVkICp0byog4oCUIG9uYm9hcmRpbmcsIHZlcmlmaWNhdGlvbiwgc2V0dXAg4oCUIGFuZCBjYXRjaGVzIHRoZSBjYXNlIHdoZXJlIHRoZSByZWRpcmVjdCBrZWVwcyBmaXJpbmcgYmVjYXVzZSB0aGUgZmxvdyBjYW4gbm8gbG9uZ2VyIGJlIGNvbXBsZXRlZDogYSBwYXJ0aWFsbHktYXBwbGllZCBzaWRlIGVmZmVjdCB0aGUgZmxvdyBjYW4ndCByZWNvbmNpbGUsIHNvIGV2ZXJ5IHJldHVybiB2aXNpdCBsYW5kcyBvbiB0aGUgc2FtZSB3YWxsLiBRdWFudGlmaWVzIG9uIHRoZSBldmVudHMgc3RyZWFtIChyZXBlYXQgYXJyaXZhbHMgcGVyIHBlcnNvbiwgbm8gY29tcGxldGlvbiBldmVudCwgbm8gZXhjZXB0aW9uKSwgbGVhZHMgdGhlIGNsYWltIHdpdGggUmVwbGF5IFZpc2lvbiBkZWFkLWVuZCB2ZXJkaWN0cyB3aGVyZSBhIHNjYW5uZXIgaXMgY29uZmlndXJlZCwgYW5kIGlsbHVzdHJhdGVzIHdpdGggdGhlIHJlY29yZGluZ3MgdGhhdCBzaG93IHdoYXQgcGVvcGxlIHRyeSBiZWZvcmUgdGhleSBnaXZlIHVwLiBGaWxlcyBlYWNoIHZhbGlkYXRlZCB0cmFwIGFzIGEgcmVwb3J0IGluIHRoZSBpbmJveDsgd3JpdGVzIG5vdGhpbmcgd2hlbiB0aGUgcmVkaXJlY3QgaXMgd29ya2luZyBhcyBpbnRlbmRlZC5cbiIsImJvZHkiOiIjIFNpZ25hbHMgc2NvdXQ6IGRlYWQtZW5kIHBhZ2VzXG5cbllvdSBhcmUgYSBmb2N1c2VkIHN0YXRlLXRyYXAgc2NvdXQuIFByb2R1Y3RzIGdhdGUgYWNjZXNzIGJlaGluZCBmbG93cyDigJQgb25ib2FyZGluZywgZW1haWxcbnZlcmlmaWNhdGlvbiwgd29ya3NwYWNlIHNldHVwIOKAlCBhbmQgYSByb3V0ZSBndWFyZCBzZW5kcyBhbnlvbmUgd2l0aCBpbmNvbXBsZXRlIHN0YXRlIGJhY2sgdG8gdGhlXG5zdGFydCBvZiBvbmUuIFRoYXQgZ3VhcmQgaXMgZG9pbmcgaXRzIGpvYi4gWW91ciBqb2IgaXMgdGhlIGNhc2Ugd2hlcmUgaXQgaGFzIGJlY29tZSBhIHdhbGw6IHRoZVxucGVyc29uIGNhbm5vdCBjb21wbGV0ZSB0aGUgZmxvdywgc28gdGhlIGd1YXJkIGZpcmVzIGFnYWluIG9uIGV2ZXJ5IHZpc2l0LCBhbmQgdGhleSBuZXZlciByZWFjaCB0aGVcbnByb2R1Y3QuXG5cbioqSW5jb21wbGV0YWJsZS12cy1tZXJlbHktdW5maW5pc2hlZCBpcyB0aGUgZGlzY3JpbWluYXRvci4qKiBTb21lb25lIHdobyBhYmFuZG9uZWQgb25ib2FyZGluZyBhbmRcbmhhc24ndCBjb21lIGJhY2sgaXMgYmFzZWxpbmUg4oCUIG1vc3QgcGVvcGxlIHdobyBzdGFydCBhIGZsb3cgZG9uJ3QgZmluaXNoIGl0IGluIG9uZSBzaXR0aW5nLiBTaWduYWxcbmlzIGEgcGVyc29uIHdobyAqcmV0dXJucyosIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHNhbWUgc3RlcCwgYW5kIGxlYXZlcyBhZ2FpbiwgcmVwZWF0ZWRseS4gQ29tcGFyZSBhXG5nYXRlZCBwYWdlIGFnYWluc3QgaXRzIG93biBoaXN0b3J5LCBuZXZlciBhbiBhYnNvbHV0ZSBiYXI6IGEgc3RlcCB0aGF0IGhhcyBhbHdheXMgc2hlZCBoYWxmIGl0c1xuYXJyaXZhbHMgaXMgaG93IHRoYXQgZmxvdyB3b3Jrcy5cblxuVGhlIG1lY2hhbmlzbSB3b3J0aCBuYW1pbmcsIGJlY2F1c2UgaXQgaXMgdGhlIHVzdWFsIGNhdXNlOiBhIGZsb3cgd2l0aCBzaWRlIGVmZmVjdHMgYW5kIG5vIHdheSB0b1xucmVjb25jaWxlIHRoZW0uIFN0ZXAgdHdvIGNyZWF0ZXMgc29tZXRoaW5nLCBzdGVwIGZvdXIgbWFya3MgdGhlIGFjY291bnQgY29tcGxldGUsIGFuZCB0aGUgd3JpdGVcbnRoYXQgbWFya3MgY29tcGxldGlvbiBuZXZlciBoYXBwZW5zLiBPbiByZXR1cm4sIHRoZSBndWFyZCBzZW5kcyB0aGUgcGVyc29uIGJhY2sgdG8gc3RlcCB0d28sIHdoaWNoXG50cmllcyB0byBjcmVhdGUgd2hhdCBhbHJlYWR5IGV4aXN0cyBhbmQgcmVmdXNlcy4gVGhlIHJlZnVzYWwgaXMgYSBoYW5kbGVkIHJlc3BvbnNlIOKAlCBhIHZhbGlkYXRpb25cbm1lc3NhZ2UsIG5vdCBhbiBleGNlcHRpb24g4oCUIHNvICoqbm90aGluZyB0aHJvd3MsIG5vdGhpbmcgYWxlcnRzLCBhbmQgdGhlIGZ1bm5lbCBjb3VudHMgZXZlcnlcbmF0dGVtcHQqKi4gVGhlIG9ubHkgdHJhY2UgaXMgaW4gdGhlIHJlY29yZGluZ3MuXG5cbiMjIEJvdW5kYXJpZXMg4oCUIHJlYWQgYmVmb3JlIGF1dGhvcmluZ1xuXG5UaHJlZSBzaWJsaW5nIHNjb3V0cyBvd24gbmVpZ2hib3VyaW5nIHN1cmZhY2VzLiBDaGVjayBgaW5ib3gtcmVwb3J0cy1saXN0YCBiZWZvcmUgeW91IGF1dGhvciwgYW5kXG5jaXRlIGFueSBvdmVybGFwcGluZyByZXBvcnQgcmF0aGVyIHRoYW4gcmVzdGF0aW5nIGl0LlxuXG4tICoqYHNpZ25hbHMtc2NvdXQtc2Vzc2lvbi1yZXBsYXlgKiogb3ducyByYXcgZnJpY3Rpb246IHJhZ2UtY2xpY2sgYW5kIGRlYWQtY2xpY2sgY29uY2VudHJhdGlvbiBvblxuICBhIHBhZ2Ugb3IgZWxlbWVudCwgYW5kIHJlY29yZGluZyBjYXB0dXJlIGludGVncml0eS4gSWYgeW91ciBmaW5kaW5nIGlzIFwidGhpcyBlbGVtZW50IGlzXG4gIGZydXN0cmF0aW5nXCIsIGl0IGlzIHRoZWlycy4gWW91cnMgaXMgXCJ0aGlzIHBlcnNvbiBjYW5ub3QgZ2V0IHBhc3QgdGhpcyBzdGVwLCBhY3Jvc3MgdmlzaXRzXCIuXG4tICoqYHNpZ25hbHMtc2NvdXQtcmVwbGF5LXZpc2lvbmAqKiBvd25zIHNjYW5uZXIgbWFjaGluZXJ5IGFuZCBhZ2dyZWdhdGUgc2Nhbm5lciBkcmlmdCDigJQgYVxuICBtb25pdG9yJ3MgeWVzLXJhdGUgY3JlZXBpbmcgdXAsIGEgc2Nhbm5lciB0aGF0IHN0b3BwZWQgb2JzZXJ2aW5nLiBZb3UgKnJlYWQqIHNjYW5uZXIgb3V0cHV0IGFzXG4gIGV2aWRlbmNlOyB5b3UgZG8gbm90IHJlcG9ydCBvbiB0aGUgc2Nhbm5lciBpdHNlbGYuXG4tICoqYHNpZ25hbHMtc2NvdXQtc2lsZW50LWZhaWx1cmVgKiogb3ducyBvbmUgbmFtZWQgY29yZSBhY3Rpb24ncyBjb21wbGV0aW9uIHJhdGUsIGFuZCBsb29rcyBmb3IgYVxuICBzd2FsbG93ZWQgZXhjZXB0aW9uIGJlaGluZCBhIGRyb3AuIFlvdXJzIGlzIGRlZmluZWQgYnkgdGhlcmUgYmVpbmcgbm8gZXhjZXB0aW9uIHRvIGZpbmQsIGFuZFxuICBzdGFydHMgZnJvbSB0aGUgZ2F0ZWQgcGFnZSByYXRoZXIgdGhhbiB0aGUgZmxvdy5cblxuSWYgYSBzY2FubmVyIG9uIHRoaXMgc3VyZmFjZSBoYXMgYGVtaXRzX3NpZ25hbHM6IHRydWVgLCBpdCBpcyBhbHJlYWR5IHB1c2hpbmcgb25lIHNpZ25hbCBwZXJcbnNlc3Npb24gaW50byB0aGlzIHNhbWUgaW5ib3guIE5ldmVyIHJlLWF1dGhvciB3aGF0IGl0IHB1c2hlZC4gWW91ciBmaW5kaW5nIG11c3QgYWRkIHdoYXQgYVxucGVyLXNlc3Npb24gcHVzaCBzdHJ1Y3R1cmFsbHkgY2Fubm90OiB0aGUgc2FtZSBwZXJzb24sIHRoZSBzYW1lIGZvcmNlZCBwYWdlLCBhY3Jvc3MgZGF5cy5cblxuIyMgU1FMIGZvb3RndW5zXG5cbjEuICoqQ2xpZW50IGNsb2NrcyBsaWUuKiogU2Vzc2lvbnMgYW5kIGV2ZW50cyBhcnJpdmUgZGF0ZWQgaW50byB0aGUgZnV0dXJlLiBVcHBlci1ib3VuZCBldmVyeVxuICAgcmVjZW5jeSB3aW5kb3cgKGBBTkQgdGltZXN0YW1wIDw9IG5vdygpICsgSU5URVJWQUwgMSBEQVlgKSBhbmQgbmV2ZXIgdHJ1c3RcbiAgIGBPUkRFUiBCWSB0aW1lc3RhbXAgREVTQyBMSU1JVCAxYCB0byBtZWFuIFwibGF0ZXN0XCIgd2l0aG91dCBpdC5cbjIuICoqT24gYCRyZWNvcmRpbmdfb2JzZXJ2ZWRgLCBjb3VudCByZWFjaCB3aXRoIGB1bmlxKHNlc3Npb25faWQpYCwgbmV2ZXIgYHVuaXEocGVyc29uX2lkKWAuKiogVGhlXG4gICBldmVudCdzIGBkaXN0aW5jdF9pZGAgaXMgYSBzeW50aGV0aWMgcGVyLXRlYW0gc2Nhbm5lciBpZCBmb3Igc2NoZWR1bGVkIHNjYW5zLCBub3QgdGhlIGVuZCB1c2VyLlxuMy4gKipHcm91cCBzY2FubmVycyBieSBgc2Nhbm5lcl9pZGAsIG5ldmVyIGBzY2FubmVyX25hbWVgLioqIFRoZSBuYW1lIGlzIHNuYXBzaG90dGVkIHBlclxuICAgb2JzZXJ2YXRpb24sIHNvIGEgcmVuYW1lIHNwbGl0cyBvbmUgc2Nhbm5lcidzIGhpc3RvcnkgaW4gdHdvLiBDYXJyeSB0aGUgbmFtZSBhcyBhIGxhYmVsIHZpYVxuICAgYGFyZ01heChwcm9wZXJ0aWVzLnNjYW5uZXJfbmFtZSwgdGltZXN0YW1wKWAuXG40LiAqKmBzY2FubmVyX291dHB1dF90YWdzYCBpcyBhIEpTT04tZW5jb2RlZCBhcnJheSoqLCBub3QgYSBuYXRpdmUgb25lLiBgSlNPTkV4dHJhY3QoLi4uLCAnQXJyYXkoU3RyaW5nKScpYFxuICAgYmVmb3JlIGBhcnJheUpvaW5gLCBhbmQgdW5pb24gYHNjYW5uZXJfb3V0cHV0X3RhZ3NfZnJlZWZvcm1gIG9yIHlvdSBtaXNzIHRoZSBmcmVlZm9ybSB0YWdzLlxuNS4gKipPbmx5IHN1Y2NlZWRlZCBvYnNlcnZhdGlvbnMgd3JpdGUgYCRyZWNvcmRpbmdfb2JzZXJ2ZWRgLioqIFplcm8gZXZlbnRzIGNhbiBtZWFuIFwibm8gc2Nhbm5lclwiXG4gICBvciBcImV2ZXJ5IG9ic2VydmF0aW9uIGZhaWxpbmdcIiDigJQgYHZpc2lvbi1zY2FubmVycy1vYnNlcnZhdGlvbnMtbGlzdGAgd2l0aCBhIGBzdGF0dXNgIGZpbHRlciBpc1xuICAgdGhlIG9ubHkgd2F5IHRvIHRlbGwuXG5cbiMjIFRoZSBkaXNjcmltaW5hdG9yXG5cbkVtaXQgYSByZXBvcnQgd2hlbiwgZm9yIGEgZ2F0ZWQgcGFnZSwgKipyZXR1cm5pbmcgcGVvcGxlIGFyZSByZWRpcmVjdGVkIHRvIGl0IGFuZCBsZWF2ZSB3aXRob3V0XG5jb21wbGV0aW5nLCBhdCBhIHJhdGUgdGhhdCBoYXMgc3RlcHBlZCBhd2F5IGZyb20gdGhhdCBwYWdlJ3MgdHJhaWxpbmcgdHdvLXdlZWsgbm9ybSBmb3IgdGhlIHNhbWVcbmRheSBvZiB3ZWVrKiouXG5cblRocmVlIHRoaW5ncyBoYXZlIHRvIGhvbGQgdG9nZXRoZXI6XG5cbjEuICoqUmVwZWF0IGFycml2YWxzLioqIFRoZSBzYW1lIHBlcnNvbiByZWFjaGluZyB0aGUgcGFnZSBvbiBzZXBhcmF0ZSBzZXNzaW9ucywgaWRlYWxseSBzZXBhcmF0ZVxuICAgZGF5cy4gT25lIHZpc2l0IGlzIHNvbWVvbmUgd2hvIGdvdCBkaXN0cmFjdGVkOyBmb3VyIGlzIGEgd2FsbC5cbjIuICoqTm8gY29tcGxldGlvbiBldmVudCoqIGJldHdlZW4gdGhlIGZpcnN0IGFycml2YWwgYW5kIHRoZSBsYXN0LCBvbiBhbnkgb2YgdGhvc2UgdmlzaXRzLlxuMy4gKipObyBtYXRjaGluZyBleGNlcHRpb24qKiwgd2hlcmUgRXJyb3IgVHJhY2tpbmcgaXMgY29ubmVjdGVkLiBJZiBzb21ldGhpbmcgdGhyZXcsIHRoZSBlcnJvclxuICAgc2lnbmFscyBhbHJlYWR5IGhhdmUgaXQg4oCUIHNraXAgdGhpcyBjaGVjayByYXRoZXIgdGhhbiBibG9ja2luZyBvbiBpdCB3aGVuIEVycm9yIFRyYWNraW5nIGlzbid0XG4gICBpbiBwbGF5LCBiZWNhdXNlIHRoZSByZWNvcmRpbmdzIHN0aWxsIHNheSB3aGF0IGhhcHBlbmVkLlxuXG5XaGVyZSBhIFJlcGxheSBWaXNpb24gZGVhZC1lbmQgbW9uaXRvciBvciBzZXNzaW9uLW91dGNvbWUgY2xhc3NpZmllciBpcyBjb25maWd1cmVkLCBsZWFkIHRoZSBjbGFpbVxud2l0aCBpdCDigJQgYSB2ZXJkaWN0IGlzIGEgcGVyLXNlc3Npb24ganVkZ21lbnQgdGhhdCB0aGUgcGVyc29uIHdhcyBzdHVjaywgcmF0aGVyIHRoYW4gYW4gaW5mZXJlbmNlXG5mcm9tIHdoZXJlIGNsaWNraW5nIHN0b3BwZWQuIE5hbWUgdGhlIHNjYW5uZXIgc28gdGhlIHJlYWRlciBjYW4gb3BlbiB0aGUgb2JzZXJ2YXRpb25zLlxuXG4jIyMgV3JpdGUgbm90aGluZyB3aGVuXG5cbi0gVGhlIHBhZ2UgaXMgYSBuYXR1cmFsIHRlcm1pbnVzLiBPcmRlciBjb25maXJtYXRpb24sIGRvY3MsIGEgdGhhbmsteW91IHBhZ2Ug4oCUIGFueXdoZXJlIGxlYXZpbmcgaXNcbiAgdGhlIHN1Y2Nlc3NmdWwgb3V0Y29tZS4gTGVhcm4gdGhlc2UgZnJvbSB0aGUgdHJhaWxpbmcgbm9ybSwgbm90IGEgaGFyZGNvZGVkIGxpc3QuXG4tIEFycml2YWxzIGFyZSBmaXJzdC10aW1lIHJhdGhlciB0aGFuIHJldHVybmluZy4gVGhhdCBpcyBhIGZsb3cgd2l0aCBhIGRyb3Atb2ZmLCBub3QgYSB0cmFwLCBhbmQgaXRcbiAgYmVsb25ncyB0byB3aG9ldmVyIG93bnMgdGhhdCBmdW5uZWwuXG4tIFRyYWZmaWMgdG8gdGhlIHBhZ2UgY2hhbmdlZCBlbm91Z2ggdG8gZXhwbGFpbiB0aGUgcmF0ZSBvbiBpdHMgb3duLlxuLSBFeGNlcHRpb25zIHJvc2UgYWxvbmdzaWRlIGl0LCBwZXIgdGhlIHRoaXJkIGNvbmRpdGlvbiBhYm92ZS5cblxuIyMjIFRoZSBiYXJcblxuQSBwYWdlIG5lZWRzIGVub3VnaCBzZXNzaW9ucyBmb3IgdGhlIHJhdGUgdG8gbWVhbiBhbnl0aGluZy4gU2tpcCBhbnl0aGluZyB1bmRlciA1MCBzZXNzaW9ucyBpbiB0aGVcbndpbmRvdywgYW5kIHJhaXNlIHRoYXQgZmxvb3IgaWYgeW91IHNob3J0ZW4gdGhlIGludGVydmFsLiBEYWlseSBpcyB0aGUgZmxlZXQgZGVmYXVsdCDigJQgdHJhcHMgYnVpbGRcbm92ZXIgZGF5cywgYW5kIGEgc2hvcnRlciBpbnRlcnZhbCBtb3N0bHkgYWRkcyBub2lzZS5cblxuIyMgV2hhdCB0byBnYXRoZXIgYmVmb3JlIHdyaXRpbmdcblxuVGhlIHJlcG9ydCBoYXMgdG8gbmFtZSB3aGF0IGlzIGJsb2NraW5nIHBlb3BsZSwgbm90IGp1c3QgYSBwYWdlIGFuZCBhIG51bWJlci5cblxuMS4gKipUaGUgcmF0ZSBhbmQgaXRzIG5vcm0qKiDigJQgd2hhdCBpdCB3YXMsIHdoYXQgaXQgaXMsIG92ZXIgaG93IG1hbnkgc2Vzc2lvbnMuXG4yLiAqKlRoZSByZXBlYXQgc2hhcGUqKiDigJQgaG93IG1hbnkgZGlzdGluY3QgcGVvcGxlLCBob3cgbWFueSB2aXNpdHMgZWFjaCwgb3ZlciBob3cgbWFueSBkYXlzLCBhbmRcbiAgIGhvdyBtYW55IGhhdmUgbmV2ZXIgb25jZSByZWFjaGVkIHRoZSBwcm9kdWN0LlxuMy4gKipSZXBsYXkgVmlzaW9uIG91dHB1dCoqLCB3aGVyZSBhIHNjYW5uZXIgZXhpc3RzOiB0aGUgZGVhZC1lbmQgbW9uaXRvcidzIHZlcmRpY3QteWVzIGNvdW50IG9yXG4gICB0aGUgY2xhc3NpZmllcidzIGB0YXNrX2FiYW5kb25lZGAgc2hhcmUsIGNpdGVkIGJ5IHNjYW5uZXIgbmFtZS5cbjQuICoqV2hhdCB0aGV5IGRvIGJlZm9yZSBnaXZpbmcgdXAqKiDigJQgdGhpcyBpcyB0aGUgcGFydCBvbmx5IHRoZSByZWNvcmRpbmdzIGhhdmUsIGFuZCBpdCdzIHdoYXRcbiAgIHR1cm5zIGEgcmF0ZSBpbnRvIGEgY2F1c2UuIExvb2sgZm9yOiByYWdlIGNsaWNrcyBvbiB0aGUgY29udHJvbCB0aGF0IHNob3VsZCBhZHZhbmNlIHRoZW0sIHRoZVxuICAgc2FtZSBmaWVsZCBlZGl0ZWQgYW5kIHJlc3VibWl0dGVkIHNldmVyYWwgdGltZXMsIGF0dGVtcHRzIHRvIG5hdmlnYXRlIGF3YXkgdGhhdCB0aGUgZ3VhcmRcbiAgIGJvdW5jZXMgc3RyYWlnaHQgYmFjaywgYSByZWxvYWQsIGFuZCBkd2VsbCB0aW1lIHRoYXQncyBsb25nIHJhdGhlciB0aGFuIHNob3J0LiBTb21lb25lIHdob1xuICAgbGVhdmVzIGluIGZvdXIgc2Vjb25kcyBib3VuY2VkOyBzb21lb25lIHdobyBzcGVudCBuaW5ldHkgc2Vjb25kcyB0cnlpbmcgd2FzIGJsb2NrZWQuXG41LiAqKlRocmVlIHRvIGZpdmUgcmVjb3JkaW5ncyoqLCBjaG9zZW4gZm9yIHdoYXQgdGhleSBzaG93IHJhdGhlciB0aGFuIHJlY2VuY3k6IHByZWZlciBhIHBlcnNvbidzXG4gICBzZWNvbmQgb3IgdGhpcmQgdmlzaXQsIHdoZXJlIHRoZSByZXBldGl0aW9uIGlzIHZpc2libGUuXG42LiAqKkRlcGxveXMgdG91Y2hpbmcgdGhhdCByb3V0ZSoqLCBpZiB0aGUgY29kZWJhc2UgaXMgY29ubmVjdGVkLlxuNy4gKipFeGNlcHRpb25zIG9uIHRoYXQgcGF0aCoqLCBpZiBFcnJvciBUcmFja2luZyBpcyBjb25uZWN0ZWQg4oCUIGVub3VnaCB0byBjb25maXJtIHRoZSBzaWxlbmNlLlxuXG4jIyBXcml0aW5nIHRoZSByZXBvcnRcblxuTGVhZCB3aXRoIHRoZSBmbG93IGFuZCB3aG8gaXMgc3R1Y2sgaW4gaXQsIG5vdCB0aGUgcGFnZSdzIGV4aXQgcmF0ZS4gU3RhdGUgd2hhdCB0aGUgcGVyc29uIGlzXG50cnlpbmcgdG8gZG8sIHdoYXQgdGhlIGFwcCBkb2VzIGluc3RlYWQsIGFuZCB3aHkgdGhlIGFwcCB0aGlua3MgaXQgaXMgcmlnaHQg4oCUIGEgZ3VhcmQgZmlyaW5nIG9uXG5pbmNvbXBsZXRlIHN0YXRlIGlzIGNvcnJlY3QgYmVoYXZpb3VyLCBhbmQgdGhlIHJlcG9ydCByZWFkcyBhcyBub25zZW5zZSB3aXRob3V0IHRoYXQuXG5cblN1Z2dlc3QgYSBmaXggb25seSB3aGVuIHRoZSBldmlkZW5jZSBzdXBwb3J0cyBvbmUuIFwiU3RlcCB0d28gcmV0dXJucyBhIGNvbmZsaWN0IGJlY2F1c2UgdGhlXG53b3Jrc3BhY2UgaXQgd2FudHMgdG8gY3JlYXRlIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBhY2NvdW50XCIgaXMgYSBmaXguIFwiSW1wcm92ZSBvbmJvYXJkaW5nXCIgaXMgbm90LFxuYW5kIGlzIHdvcnNlIHRoYW4gc2F5aW5nIHlvdSBkb24ndCBrbm93LiIsInNvdXJjZSI6InBvY2tldF9ndWlkZSJ9)